Командный переключатель -n
заставляет Perl выполнять следующий цикл вокруг вашей программы, который заставляет его перебирать аргументы имени файла, вроде sed -n
или awk
:
LINE:
while (<>) {
... # your program goes here
}
, где <>
дескриптор файла является специальным
Ввод из <>
происходит либо из стандартного ввода, либо из каждого файла, указанного в командной строке.
Другими словами, он читает строки из всех файлов, указанных в командной строке. -p
делает то же самое, за исключением того, что он также печатает $_
каждый раз до конца.
Эти имена файлов находятся в @ARGV
переменной , которая в вашем примере имеет filexyy.txt
и yy
, и которые, таким образом, обрабатываются как имена файлов.
Одно решение: удалите необходимые параметры (yy
здесь) из @ARGV
, в блоке BEGIN
. Тогда операция <>
действительно будет иметь только имена файлов для работы.
Это поднимает вопрос о желаемом интерфейсе вашей программы. Если вы хотите, чтобы этот параметр был указан последним в командной строке
my $param;
BEGIN {
$param = pop @ARGV;
}
, поскольку pop удаляет из задней части массива; если вы хотите, чтобы параметр был задан первым, используйте shift . Обратите внимание, что ваш $recmark
также должен быть удален из @ARGV
.
Отслеживание всего этого подвержено ошибкам и неудобно как для использования, так и для дальнейшей работы.
Было бы гораздо лучше обработать эти аргументы, используя хороший модуль, такой как Getopt :: Long . Затем вы можете дать им имена, легко менять интерфейс по мере необходимости и правильно проверять каждый вызов модулем.
Также обратите внимание, что с именами файлов в @ARGV
, которые остаются после того, как вы (или Getopt::Long
) сделали с опциями, вы можете обрабатывать все строки из всех файлов внутри
while (<>) { ... }
с использованием того же <>
, упомянутого выше. Внутри скрипта это намного лучше, чем -p
.