Является ли __LINE__ свернутой константой в этом однострочнике Perl?

Изучая альтернативный ответ на вопрос о текущем номере строки файла Сарати, я написал этот однострочник с ожиданием, что он напечатает первая строка всех предоставленных файлов:

$ perl -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt

Это не сработало, как ожидалось; все строки напечатаны.

Прогон однострочника через -MO=Deparse показывает, что условие отсутствует. Я предполагаю, что это связано с тем, что во время компиляции он был свернут константами:

$  perl -MO=Deparse -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt
LINE: while (defined($_ = <ARGV>)) {
    print "$ARGV : $_";
}
-e syntax OK

Но почему?

Запуск под Perl 5.8.8.


person Zaid    schedule 12.09.2012    source источник
comment
Проверьте мое редактирование для печати первой строки всех файлов.   -  person Vijay    schedule 12.09.2012


Ответы (2)


__LINE__ соответствует номеру строки в исходном коде Perl, а не во входном файле.

person choroba    schedule 12.09.2012
comment
Я наслаждаюсь своим «Ага!» момент здесь. Надо было внимательнее прочитать perldata... - person Zaid; 12.09.2012

__LINE__ — это номер исходной строки, т. е. номер строки программы. $. даст вам номер строки входного файла.

если вы хотите напечатать все первые строки всех файлов, вы можете попробовать это:

perl -lne '$.=0 if eof;print $_ if ($.==1)' *.txt
person Vijay    schedule 12.09.2012
comment
Ага! Что меня смутило, так это использование текущего имени файла и контекста вашей проблемы. - person Zaid; 12.09.2012