5

からの引用Perl::Critic::Policy::InputOutput::ProhibitExplicitStdin

Perlには、コマンドラインをチェックし、引数がある場合はそれらを開いてファイルとして読み取る*ARGVと呼ばれる便利な魔法のファイルハンドルがあります。引数がない場合、*ARGVは代わりに*STDINのように動作します。STDINから読み取るプログラムを作成する場合、この動作はほとんどの場合必要なものです。これは多くの場合、次の2つの同等の形式のいずれかで記述されます。

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]);
    ...
}
4

2 に答える 2

6

あなたはあなたがしたいことをするものを使います。ファイルハンドルの説明については、perlvarを参照してくださいARGVARGVまた、コマンド ラインで指定したファイル名から読み取ります。その機能が必要な場合もあれば、不要な場合もあります。

そして、Perl::Critic が言うことをする必要はありません。これらのポリシーの多くは、少数の人々の意見です。STDIN から明示的に読み取りたいだけの場合は、それが必要です。Critic ポリシーを書いている人は、あなたが何をする必要があるかを述べているわけではありません。このような質問をすることは、そのアプリケーションのコンテキストがなければほとんど意味がありません。一般的な規則は単なる一般的なものであり、特定のケースについて話すと壊れます。

意図を教えてくれなかったので、STDIN の方が意図が明確だと思う理由がわかりません。問題を記述する代わりに解決策をコーディングする傾向があるため、コード自体が語ることはほとんどありません。解決策は適切なものではない可能性があります。

あなたの場合、このコードは、使用している C 方言ではなく Perl で記述されているため、より明確だと思います:)

 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

これは、を使用<ARGV>すると、ユーザーが読み取り元のファイルを引数として指定するか、引数を指定せずにstdinにパイプすることができるためです。を使用する場合<STDIN>、配管のみが機能します。

もちろん、コマンドライン引数としてファイルを指定できるようにするかどうかはあなた次第ですが、多くのプログラムがサポートしているものなので、検討する価値があるかもしれません。

于 2010-09-19T12:21:22.420 に答える