2012-06-18 22 views
2

我想我的Perl脚本能够做到这一点:构造接受STDIN和参数变量在Perl

$ ./code file.txt | myperl.pl param1 param2 

所以基本上它会输入(STIDN)从./codeparam1param2执行它。

但为什么这不起作用:

my $param1 = $ARGV[0]; 
my $param2 = $ARGV[1]; 

while (<>) { 
    if ($param1 > 0.5 && $param2 > 0) { 
    # do something 
    } 

} 

什么是正确的结构来做到这一点?

回答

7

<> aka readline的默认参数是ARGV,它是一个神奇的文件句柄,可以从@ARGV中指定的所有文件中读取,也可以从STDIN中读取(如果没有)。由于您提供了参数,因此在使用<>之前,您需要将其从@ARGV中清除,或者明确指定<STDIN>而不使用魔术ARGV句柄。

4

在这种情况下,您必须使用<STDIN>

my $param1 = $ARGV[0]; 
my $param2 = $ARGV[1]; 

while (<STDIN>) { 
    if ($param1 > 0.5 && $param2 > 0) { 
    # do something 
    } 

} 

金刚石 - 运算符<>意味着参数+标准输入。

如果您希望使用钻石算子而不是<STDIN>,则必须先从ARGV中删除这两个参数param1param2。但我认为<STDIN>会更好。

+1

实际上''>'表示参数|| STDIN。 )但是如果其中一个参数是' - ',它仍然可以使用。 – raina77ow

+0

@ raina77ow:是的,你说的对,写'arguments'会更好。 'stdin' –

5

这工作,将删除第一个两个参数为@ARGV:

my $param1 = shift; 
my $param2 = shift; 

while (<>) { 
    if ($param1 > 0.5 && $param2 > 0) { 
    # do something 
    } 
} 

<>(简称<ARGV>)从在@ARGV上市,如果@ARGV不为空的文件中读取。当它是空的时(例如在上面,因为你将选项移出),它从STDIN读取。

另一种方法是使用<STDIN>代替<>,但随后呼叫者失去做myperl.pl param1 param2 file.txt的选项。

+1

我更喜欢这种方法,所以我添加了一个解释来完成答案。 – ikegami

+0

与ikegami的补充,这个答案是更好的,应该被接受 – ysth

相关问题