5

引用自Perl::Critic::Policy::InputOutput::ProhibitExplicitStdin

Perl 有一个名为 *ARGV 的有用的魔术文件句柄,它检查命令行,如果有任何参数,则打开并将它们作为文件读取。如果没有参数,*ARGV 的行为类似于 *STDIN。如果您想创建一个从 STDIN 读取的程序,这种行为几乎总是您想要的。这通常以以下两种等效形式之一编写:

while (<ARGV>) {
  # ... do something with each input line ...
}
# or, equivalently:
while (<>) {
  # ... do something with each input line ...
}
  • 它是“只是一个约定”还是有一些不使用的充分理由<STDIN>

我觉得<STDIN>我的代码意图比使用<>or更清晰<ARGV>

我的代码流程是这样的

my @inp = <STDIN>;
my $len = $inp[0];

...

for(my $i = 0; $i < ($len + 0); $i++) {
    my @temp = split (' ', $inp[$i]);
    ...
}
4

2 回答 2

6

你使用一个做你想做的事。有关文件句柄的说明,请参见perlvar 。还从您在命令行上指定的文件名中读取。也许你想要那个功能,也许你不想要。ARGVARGV

而且,您不必按照 Perl::Critic 所说的去做。其中许多政策是一小部分人的意见。如果您只想明确地从 STDIN 读取,那就是您需要做的。撰写批评者政策的人并没有说明您需要做什么。如果没有应用的上下文,问这样的任何问题都是毫无意义的。一般规则只是一般性的,在谈到具体情况时会分解。

我不确定您为什么认为 STDIN 的意图更清晰,因为您没有告诉我们您的意图。代码几乎从不为自己说话,因为我们倾向于编写解决方案而不是陈述问题。解决方案可能不是正确的。

就您而言,我认为这段代码更清晰,因为它是用 Perl 而不是您使用的 C 方言编写的:)

 chomp( my $length = <STDIN> );

 my $count = 0;
 while ( <STDIN> ) {
     last if $count++ > $lines_to_read; 

     my @temp = split ' ';
     ...;
     }
于 2010-09-19T13:58:06.697 回答
5

这是因为 using<ARGV>将使用户能够指定要从中读取的文件作为参数,或者在不指定参数的情况下将内容通过管道传输到标准输入中。如果您使用<STDIN>,则只有管道可以工作。

当然,您可以决定是否认为人们希望能够将文件指定为命令行参数,但这是很多程序都支持的,因此可能值得考虑。

于 2010-09-19T12:21:22.420 回答