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)
| 归档时间: |
|
| 查看次数: |
5227 次 |
| 最近记录: |