哪个文件是Perl的钻石运营商(空文件句柄)目前从阅读?(Which file is Perl

2019-07-04 04:42发布

我使用Perl的钻石 <>接线员在命令行上指定的文件阅读。

我希望能够回报这类消息"Trouble on line $. of file $FILENAME" ,但我怎么能知道哪些文件是当前使用的钻石?

Answer 1:

参见perlvar :

    $ARGV

Contains the name of the current file when reading from <> .

还要考虑$. 在perlvar。 如果你这样做与perl -n它或许并不一定是你想要的方式, 因为计数器不复位 perl -n使用情况。

 $. 

对于最近访问过的文件句柄当前行号。

在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

如果你想让它重置,你需要检查eof在你读循环( 感谢@Borodin)结束。 还看到了的perldoc eof

$ perl -nE 'say "$., $ARGV"; close ARGV if eof' foo.pl bar.pl


文章来源: Which file is Perl's diamond operator (null file handle) currently reading from?