我希望我的perl脚本能够执行此操作:
$ ./code file.txt | myperl.pl param1 param2
Run Code Online (Sandbox Code Playgroud)
所以基本上它需要输入(STIDN)./code并用param1和执行它param2.
但为什么这不起作用:
my $param1 = $ARGV[0];
my $param2 = $ARGV[1];
while (<>) {
if ($param1 > 0.5 && $param2 > 0) {
# do something
}
}
Run Code Online (Sandbox Code Playgroud)
做什么是正确的结构?
<>aka readline的默认参数是ARGV,它是一个魔术文件句柄,可以读取@ARGV中指定的所有文件,如果没有,则从STDIN读取.由于您提供了参数,因此您需要在使用之前将它们从@ARGV中清除<>,或者明确指定<STDIN>并不使用魔法ARGV句柄.
这有效,它删除了@ARGV的前两个参数:
my $param1 = shift;
my $param2 = shift;
while (<>) {
if ($param1 > 0.5 && $param2 > 0) {
# do something
}
}
Run Code Online (Sandbox Code Playgroud)
<>(简称<ARGV>)从@ARGVif中列出的文件中读取if是否@ARGV为空.当它为空时(例如在上面因为你将选项移出),它会从中读取STDIN.
替代方案是使用<STDIN>而不是<>,然后调用者失去了做的选择myperl.pl param1 param2 file.txt.