2010-04-12 65 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