我正在使用 Perl 的菱形 <>
运算符来读取命令行上指定的文件。
我希望能够报告类似 的消息"Trouble on line $. of file $FILENAME"
,但我如何才能知道钻石当前使用的是哪个文件?
我正在使用 Perl 的菱形 <>
运算符来读取命令行上指定的文件。
我希望能够报告类似 的消息"Trouble on line $. of file $FILENAME"
,但我如何才能知道钻石当前使用的是哪个文件?
见perlvar:
$ARGV
Contains the name of the current file when reading from <> .
但也考虑$.
在 perlvar 中。如果你这样做,perl -n
它可能不会变成你想要的方式,因为计数器在perl -n
用例中没有被重置。
$.
最后访问的文件句柄的当前行号。
Perl 中的每个文件句柄都会计算从中读取的行数。(根据 的值
$/
,Perl 对什么构成行的想法可能与您的不匹配。)当从文件句柄(通过readline()
或<>
)读取一行时,或tell()
在seek()
其上调用 or 时,$.
将成为该行计数器的别名文件句柄。您可以通过分配来调整计数器
$.
,但这实际上不会移动搜索指针。本地化$.
不会本地化文件句柄的行数。相反,它将本地化 perl 的关于$.
当前别名为哪个文件句柄的概念。
$.
在文件句柄关闭时重置,但在打开的文件句柄在没有干预的情况下重新打开时不会重置close()
。有关更多详细信息,请参阅 perlop 中的 I/O 运算符。因为<>
从不显式关闭,所以 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
如果您希望它重置,您需要eof
在读取循环结束时检查(感谢@Borodin)。另请参阅perldoceof
:
$ perl -nE 'say "$., $ARGV"; close ARGV if eof' foo.pl bar.pl