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

StackOverflow https://stackoverflow.com/questions/2344926

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top