我正在使用Perl的 diamond <>
运算符来读取命令行中指定的文件。
我希望能够报告"Trouble on line $. of file $FILENAME"
之类的消息,但是如何判断钻石当前使用的是哪个文件?
答案 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}}