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

Pyp*_*ros 16 perl diamond-operator

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

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

sim*_*que 17

perlvar:

    $ARGV

Contains the name of the current file when reading from <> .
Run Code Online (Sandbox Code Playgroud)

但也考虑$.在perlvar.如果你这样做perl -n可能不会以你想要的方式,因为在用例中没有重置计数器perl -n.

$.
Run Code Online (Sandbox Code Playgroud)

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

Perl中的每个文件句柄都计算从中读取的行数.(根据不同的价值$/,什么构成线Perl的想法可能不符合你的.)当线从一个文件句柄读(通过readline()<>),或在tell()seek()正在调用它,$.变成一个别名为行计数器文件句柄.

您可以通过分配来调整计数器$.,但这实际上不会移动搜索指针.本地化$.不会本地化文件句柄的行数.相反,它将本地化​​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
Run Code Online (Sandbox Code Playgroud)

如果你想重置它,你需要eof在读取循环结束时检查(感谢@Borodin).另见perldoceof:

$ perl -nE 'say "$., $ARGV"; close ARGV if eof' foo.pl bar.pl
Run Code Online (Sandbox Code Playgroud)

  • 规范方法是在读取循环结束时写入"关闭ARGV if eof".这会将`$ .`重置为零. (4认同)