Как я могу смешивать аргументы командной строки и имена файлов для ‹› в Perl?

Рассмотрим следующую глупую программу на Perl:

$firstarg = $ARGV[0];

print $firstarg;

$input = <>;

print $input;

Я запускаю его из терминала, например:

perl myprog.pl sample_argument

И получить эту ошибку:

Can't open sample_argument: No such file or directory at myprog.pl line 5.

Есть идеи, почему это так? Когда он доходит до ‹>, он пытается прочитать из (несуществующего) файла «sample_argument» или что-то в этом роде? И почему?


person Jimmeh    schedule 26.02.2010    source источник


Ответы (3)


<> является сокращением для «чтения из файлов, указанных в @ARGV, или, если @ARGV пусто, то чтение из STDIN». В вашей программе @ARGV содержит значение ("sample_argument"), поэтому Perl пытается читать из этого файла, когда вы используете оператор <>.

Вы можете исправить это, очистив @ARGV перед тем, как перейти к строке <>:

$firstarg = shift @ARGV;
print $firstarg;
$input = <>;       # now @ARGV is empty, so read from STDIN
print $input;
person mob    schedule 26.02.2010

См. справочную страницу perlio, которая частично гласит:

The null filehandle <> is special: it can be used to emulate the behavior of sed and awk. Input from <> comes either from standard input, or from each file listed on the command line. Here’s how it works: the first time <> is evaluated, the @ARGV array is checked, and if it is empty, $ARGV[0] is set to "-", which when opened gives you standard input. The @ARGV array is then processed as a list of filenames.

Если вам нужен STDIN, используйте STDIN, а не <>.

person Sean    schedule 26.02.2010

По умолчанию perl использует аргументы командной строки в качестве входных файлов для <>. После того, как вы их использовали, вы должны потреблять их сами с shift;

person Paul Tomblin    schedule 26.02.2010
comment
У тебя наоборот. По умолчанию Perl ничего не делает с @ARGV. Это поведение <> особенное. - person Michael Carman; 27.02.2010
comment
Это то, что я говорил. Это ‹› использует @ARGV, если вы сами не используете их со сдвигом. - person Paul Tomblin; 27.02.2010