18

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

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

4

1 回答 1

19

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
于 2012-11-27T13:12:14.500 回答