Как я могу смешивать аргументы командной строки и имена файлов для <> в 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» или что-то в этом роде?И почему?
Решение
<>
является сокращением от «прочитать из файлов, указанных в @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;