我为什么要使用<argv>或&lt;&gt;而不是Perl中的<stdin>?</stdin> </argv>

时间:2010-09-19 12:17:11

标签: perl coding-style

引自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>使我的代码意图比使用<><ARGV>更明确。

我的代码流程就像这样

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

...

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

2 个答案:

答案 0 :(得分:6)

你使用那个做你想做的事情。有关ARGV文件句柄的说明,请参阅perlvarARGV还会从您在命令行中指定的文件名中读取。也许你想要这个功能,也许你不需要。

而且,你不必做Perl :: Critic所说的。其中许多政策都是一小群人的意见。如果您只想明确地读取STDIN,那就是您需要做的。撰写评论政策的人不会说明你需要做什么。在没有应用的背景下,提出这样的问题大多没有意义。一般规则仅仅是一般规则,在讨论具体案例时会中断。

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

在你的情况下,我认为这段代码更清晰,因为它是用Perl而不是你正在使用的C语言编写的。

 chomp( my $length = <STDIN> );

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

     my @temp = split ' ';
     ...;
     }

答案 1 :(得分:5)

这是因为使用<ARGV>将允许用户指定要作为参数读取的文件,或者在不指定参数的情况下将内容管道输入stdin。如果您使用<STDIN>,则只有管道可用。

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