构造用于接受Perl中的STDIN和参数参数

nev*_*int 2 perl stdin argv

我希望我的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)

做什么是正确的结构?

yst*_*sth 7

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


Bil*_*ert 5

这有效,它删除了@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.