Почему я должен использовать <ARGV>или <> вместо <STDIN>в Perl? - PullRequest
5 голосов
/ 19 сентября 2010

Цитирование из 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 ]

6 голосов
/ 19 сентября 2010

Вы используете тот, который делает то, что вы хотите сделать.См. perlvar для объяснения дескриптора файла ARGV.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 ' ';
     ...;
     }
5 голосов
/ 19 сентября 2010

Это связано с тем, что использование <ARGV> позволит пользователям либо указывать файлы для чтения в качестве аргументов, либо передавать данные в stdin без указания аргументов.Если вы используете <STDIN>, будет работать только трубопровод.

Конечно, вам решать, хотите ли вы, чтобы люди могли указывать файлы в качестве аргументов командной строки, но это много программ.поддержка, так что, возможно, стоит подумать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...