引自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]);
...
}
答案 0 :(得分:6)
你使用那个做你想做的事情。有关ARGV
文件句柄的说明,请参阅perlvar。 ARGV
还会从您在命令行中指定的文件名中读取。也许你想要这个功能,也许你不需要。
而且,你不必做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>
,则只有管道可用。
当然,您可以自行决定是否认为人们希望能够将文件指定为命令行参数,但这是许多程序支持的内容,因此值得考虑。