2010-04-12 63 views
2

我想在bash中myperl.pl 有這樣的管現在的Perl裏面猛砸

#! /usr/bin/bash 
cut -f1,2 file1.txt | myperl.pl foo | sort -u 

參數標準輸入它的內容是這樣

my $argv = $ARG[0] || "foo"; 

while (<>) { 
chomp; 
if ($argv eq "foo") { 
    # do something with $_ 
} 
else { 
    # do another 
} 
} 

但是,爲什麼Perl腳本無法識別通過bash傳遞的參數? 即與此消息的代碼突破:

Can't open foo: No such file or directory at myperl.pl line 15. 

怎麼做,所以,我的Perl腳本可以在同一時間接收標準輸入和參數 的正確方法?

+2

有沒有使用Perl來削減特殊原因file1.txt的第一個和第二個字段?由於您使用的是Perl,因此您可以在Perl中執行所有操作,包括排序。 – ghostdog74 2010-04-12 08:49:21

回答

6

<>是特殊的:它從標準輸入或從命令行上列出的每個文件返回行。因此來自命令行的參數被解釋爲打開文件名並從中返回行。因此,錯誤消息,它無法打開文件foo

在你的情況,你知道你想從<stdin>讀取數據,所以只用這個來代替<>

while(<stdin>) 

如果您想保留在命令行上的選擇指定輸入文件的功能,你需要使用<>之前,從@ARGV刪除參數foo

my $firstarg = shift(@ARGV); 
... 
while (<>) { 
    ... 
    if ($firstarg eq "foo") ... 
+0

這讓很多perl用戶感到困惑。這是爲了模仿幾個基本的unix命令的語法而設計的;例如,這個程序的工作原理(大體上)與「貓」相同:while(<>){print;} – leonbloy 2010-04-12 22:42:43

0

嘗試:

foo=`cut -f1,2 file1.txt` 
myperl.pl $foo | sort -u 

我想,你想管從切口命令的輸出作爲參數「富」到myperl.pl腳本。

+0

我特別想在Bash腳本里面調用perl。 ($ input)是Perl吧? – neversaint 2010-04-12 08:29:17

+0

哎呀,是啊!現在它應該在bash中工作。確保你輸入foo ='cut -f1,2 file1.txt'而不是foo ='cut -f1,2 file1.txt' – lugte098 2010-04-12 08:30:51

1

爲了讓前面的參數的Perl嘗試打開它作爲輸入,使用BEGIN塊:

失敗

cat file | perl -ne '$myarg=shift; if ($myarg eq "foo") {} else {}' foo #WRONG 

Can't open foo: No such file or directory.

但這工作

cat file | perl -ne 'BEGIN {$myarg=shift}; if ($myarg eq "foo") {} else {}' foo