Его часто задавали по-разному, однако я собираюсь спросить еще раз, потому что я не полностью понимаю применение @ARGV
и потому что я не нашел ответа на этот вопрос (или, что более вероятно, я не понимаю ответы и уже предоставленные решения).
Вопрос в том, почему ничего не читается из командной строки? Кроме того, как мне расшифровать сообщение об ошибке,
Использование неинициализированного значения $name в конкатенации (.) или строки в ... ?
Я так понимаю, что @ARGV
— это массив, в котором хранятся аргументы (файлы) командной строки. Я также понимаю, что им можно манипулировать, как и любым другим массивом (учитывая, что индекс $ARGV[0]
не совпадает с функцией командной строки переменной имени файла, $0
). Я понимаю, что в цикле while алмазный оператор автоматически shift
первый элемент @ARGV
будет $ARGV[ ]
, прочитав строку на входе.
Чего я не понимаю, так это того, как присвоить элемент @ARGV
скалярной переменной, а затем распечатать датум. Например (концепция кода взята из Learning Perl),
my $name = shift @ARGV;
while (<>) {
print “The input was $name found at the start of $_\n”;
exit;
}
В соответствии с кодом вывод $name
пуст; если бы я опустил shift()
, $name
вывел бы 0
, как я считаю, и должно быть в скалярном контексте, но это не отвечает на вопрос, почему ввод из командной строки не принимается. Ваши идеи будут оценены.
Спасибо.
use warnings;
иuse strict;
в начале), то когда вы запускаете ее с аргументом, напримерprog.pl hello
, она будет ожидать ввода, так как<>
читаетSTDIN
, если никакие файлы не переданы в программа. (Поскольку выshift
-ed из@ARGV
, в котором было толькоhello
слово, в нем ничего нет, и поэтому<>
ждет.) Затем вы нажимаете Enter, и он запускает оператор печати сhello
в переменной$name
. (Если вы ничего не даете программе при запуске, тогда$name
пусто, но вы, кажется, знаете об этом.) Я не понимаю, почему/как она ведет себя по-другому для вас? - person zdim   schedule 01.11.2020while (<>)
любой ввод, считываемый с терминала, назначается$_
-- и вы не печатаете его, поэтому его невозможно увидеть. Однако это по-прежнему не объясняет, как вы можете сделать$name
пустым (если вы передаете аргумент программе при ее запуске). Значит, что-то не так в вашем описании проблемы? Обратите внимание: то, что находится в@ARGV
, воспринимается<>
как имена файлов, и эти файлы открываются и читаются построчно. - person zdim   schedule 01.11.2020<>
, эти аргументы обрабатываются как файлы (если они не были удалены из@ARGV
ранее), которые открываются и читаются построчно. Это очень полезно, поскольку вы можете использоватьwhile (<>)
для либо обработкиSTDIN
построчно (запрашивая и ожидая ввода, либо считывая ввод, переданный в программу) или для обработки файлов. Гибкий :) - person zdim   schedule 02.11.2020