Каким файлом является оператор Diamonds от Perl (нулевой дескриптор файла), который в настоящее время читается?

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

Я хотел бы иметь возможность отправлять сообщения типа "Trouble on line $. of file $FILENAME", но как я могу определить, какой файл в настоящее время используется алмазом?

Ответы

Ответ 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