为什么我应该在Perl中使用<ARGV>或<>而不是<STDIN>?

Laz*_*zer 5 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 ...
}
Run Code Online (Sandbox Code Playgroud)
  • 是"只是一个惯例"还是有一些坚实的理由不使用<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)

bri*_*foy 6

你使用那个做你想做的事情.有关文件句柄的说明,请参阅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)


Mat*_*nen 5

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

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