哪个文件是Perl的钻石操作符(空文件句柄)当前正在读取?

时间:2012-11-27 13:07:24

标签: perl diamond-operator

我正在使用Perl的 diamond <>运算符来读取命令行中指定的文件。

我希望能够报告"Trouble on line $. of file $FILENAME"之类的消息,但是如何判断钻石当前使用的是哪个文件?

1 个答案:

答案 0 :(得分:17)

请参阅perlvar

    $ARGV

Contains the name of the current file when reading from <> .

但也要考虑perlvar中的$.。如果您使用perl -n执行此操作,则可能无法按照您希望的方式执行此操作,因为perl -n用例中的计数器未重置

$.
     

访问的最后一个文件句柄的当前行号。

     

Perl中的每个文件句柄都计算已读取的行数   从中。 (根据$/的值,Perl的想法是什么   构成一条线可能与你的不匹配。)从a中读取一条线   文件句柄(通过readline()<>),或者调用tell()seek()时   在它上面,$.成为该文件句柄的行计数器的别名。

     

您可以通过指定$.来调整计数器,但这不会   实际上移动搜索指针。本地化$.不会本地化   文件句柄的行数。相反,它将本地化​​perl的概念   哪个文件句柄$.当前是别名。

     文件句柄关闭时会重置

$.,但打开文件句柄时不会重置close()   文件句柄重新打开,没有干预<>。更多   详细信息,请参阅perlop中的I / O操作符。因为HANDLE->input_line_number(EXPR)永远不会   显式关闭,ARGV文件中的行号增加(但请参阅   eof中的例子。

     

您也可以使用$ 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 访问该行   计数器给定的文件句柄,而不必担心哪个   处理你上次访问。

     

助记符:许多程序使用“。”表示当前行号。

以下是一个例子:

eof

如果您希望重置,则需要在阅读循环结束时检查$ perl -nE 'say "$., $ARGV"; close ARGV if eof' foo.pl bar.pl 感谢@Borodin )。另请参阅perldoc for eof

{{1}}