引自 Perl::Critic::Policy::InputOutput::ProhibitExplicitStdin
Perl有一个有用的魔术文件句柄,叫做*ARGV,用于检查命令行,如果有任何参数,则打开并将其作为文件读取.如果没有参数,*ARGV的行为类似于*STDIN.如果要创建从STDIN读取的程序,则此行为几乎总是您想要的.这通常用以下两种等效形式之一编写:
Run Code Online (Sandbox Code Playgroud)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]);
...
}
Run Code Online (Sandbox Code Playgroud)
你使用那个做你想做的事情.有关文件句柄的说明,请参阅perlvarARGV
.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 ' ';
...;
}
Run Code Online (Sandbox Code Playgroud)
这是因为使用<ARGV>
将使用户能够指定要作为参数读取的文件,或者在不指定参数的情况下将内容管道输入stdin.如果使用<STDIN>
,只有管道可以使用.
当然,由您自己决定是否认为人们希望能够将文件指定为命令行参数,但这是许多程序支持的内容,因此值得考虑.
归档时间: |
|
查看次数: |
4330 次 |
最近记录: |