Как я могу смешать аргументы командной строки и имена файлов для <> в Perl? - PullRequest
6 голосов
/ 27 февраля 2010

Рассмотрим следующую глупую программу 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» или что-то еще? И почему?

Ответы [ 3 ]

12 голосов
/ 27 февраля 2010

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

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

$firstarg = shift @ARGV;
print $firstarg;
$input = <>;       # now @ARGV is empty, so read from STDIN
print $input;
8 голосов
/ 27 февраля 2010

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

Нулевой дескриптор файла <> особенный: его можно использовать для эмуляции поведения sed и awk. Ввод из <> поступает либо из стандартного ввода, либо из каждого файла в списке в командной строке. Вот как это работает: при первой оценке <> Массив @ARGV проверяется, и если он пуст, $ ARGV [0] устанавливается в «-», что при открыл дает стандартный ввод. Затем массив @ARGV обрабатывается как список имена файлов.

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

1 голос
/ 27 февраля 2010

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

...