如何获取使用 Perl 打开的文件的当前行号
Posted
技术标签:
【中文标题】如何获取使用 Perl 打开的文件的当前行号【英文标题】:How to get the current line number of a file opened using Perl 【发布时间】:2011-08-20 17:05:06 【问题描述】:open my $fp, '<', $file or die $!;
while (<$fp>)
my $line = $_;
if ($line =~ /$regex/)
# How do I find out which line number this match happened at?
close $fp;
【问题讨论】:
如果你想将一行读入 $line,然后将一行读入 $line,而不是将一行读入其他变量,然后将其复制到 $line: while (my $line = ) @tadmc: 或者更确切地说是while (defined( my $line = <$fp> )) ...
,因为最后一行可能是零并且不能以换行符结尾。
【参考方案1】:
使用$.
(参见perldoc perlvar
)。
【讨论】:
从技术上讲,$.
不一定是行号;这是自该句柄的最后一个close
(不是open
)以来,在最后一个句柄上调用readline
运算符的次数。如果$/
未设置为"\n"
(例如""
或"\n%%\n"
,或者如果句柄在没有调用close
的情况下调用了open
(如发生在ARGV
,因此与 <>
)。以及对于最后一行没有正确行终止顺序的文本文件是否有意义,我留给你自己考虑。
@tchrist:您对边缘情况的解释应该作为第三个答案发布在这里。
如果使用 ,perldoc eof 推荐 continue
的一部分 while(<>) ... continue close ARGV if eof
,解决了 @tchrist 的一个很好的警告。【参考方案2】:
您也可以通过OO 界面进行操作:
use IO::Handle;
# later on ...
my $n = $fp->input_line_number();
这也在perldoc perlvar 中。
【讨论】:
当然,这与我刚刚为$.
概述的警告相同。【参考方案3】:
避免使用$.
、$_
或任何全局变量。 Here's a good answer 解释原因。相反,您可以使用:
while(my $line = <FILE>)
print $line unless $\*FILE->input_line_number == 1;
为避免这种情况和许多其他 Perl 陷阱,您可以使用 Atom 或 Visual Studio Code 包,如 linter-perl。由于这些问题,一些人认为 Perl 是 a write-only language。
【讨论】:
以上是关于如何获取使用 Perl 打开的文件的当前行号的主要内容,如果未能解决你的问题,请参考以下文章