2

我希望我的 perl 脚本能够做到这一点:

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

所以基本上它会接受输入(STIDN)并用and./code执行它。param1param2

但为什么这不起作用:

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

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

}

什么是正确的构造?

4

3 回答 3

7

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

于 2012-06-18T10:22:43.387 回答
5

这有效,它删除了@ARGV 的前两个参数:

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

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

<>(缩写<ARGV>)从@ARGVif@ARGV不为空中列出的文件中读取。当它为空时(例如在上面,因为您将选项移出),它会STDIN改为读取。

另一种方法是使用<STDIN>而不是<>,但是调用者失去了做的选择myperl.pl param1 param2 file.txt

于 2012-06-18T11:06:17.643 回答
4

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

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

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

}

菱形运算符<>表示参数 + 标准输入。

当您想使用菱形运算符而不是 时,您必须从之前<STDIN>删除这两个参数。但我认为在你的情况下会更好。param1param2ARGV<STDIN>

于 2012-06-18T10:12:17.940 回答