Ответ 1
См. perlvar:
$ARGV
Contains the name of the current file when reading from <> .
Но также рассмотрим $.
в перлаве. Если вы сделаете это с помощью perl -n
, это может не получиться так, как вам нужно, потому что счетчик не reset в случае использования perl -n
.
$.
Номер текущей строки для доступа к последней доступной файловой системе.
Каждый дескриптор файла в Perl подсчитывает количество строк, которые были прочитаны от него. (В зависимости от значения
$/
, Perl-идея того, что означает, что строка может не совпадать с вашей.) Когда строка считывается из filehandle (черезreadline()
или<>
), или когда вызываетсяtell()
илиseek()
на нем$.
становится псевдонимом счетчика строк для этого дескриптора файла.Вы можете настроить счетчик, назначив
$.
, но это не будет на самом деле переместите указатель поиска. Локализация$.
не будет локализовать файлhandle линия счет. Вместо этого он будет локализовать perl-понятие который filehandle$.
в настоящее время является псевдонимом.
$.
reset, когда дескриптор файла закрыт, но не тогда, когда открытый filehandle снова открывается без вмешательстваclose()
. Для большего подробности, см. Операторы ввода/вывода в perlop. Поскольку<>
никогда не делает явное закрытие, количество строк увеличивается в файлах ARGV (но см. примеры в eof).Вы также можете использовать
HANDLE->input_line_number(EXPR)
для доступа к строке счетчик для заданного дескриптора файла, не беспокоясь о том, какой обрабатывать последний доступ.Мнемоника: многие программы используют "." для обозначения текущего номера строки.
Вот пример:
$ perl -nE 'say "$., $ARGV";' foo.pl bar.pl
1, foo.pl
2, foo.pl
3, foo.pl
4, foo.pl
5, foo.pl
6, foo.pl
7, foo.pl
8, foo.pl
9, foo.pl
10, foo.pl
11, foo.pl
12, foo.pl
13, bar.pl
14, bar.pl
15, bar.pl
Если вы хотите его reset, вам нужно проверить eof
в конце вашего цикла чтения (спасибо @Borodin). Также смотрите perldoc для eof
:
$ perl -nE 'say "$., $ARGV"; close ARGV if eof' foo.pl bar.pl