如何获取使用 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 = &lt;$fp&gt; )) ... ,因为最后一行可能是零并且不能以换行符结尾。 【参考方案1】:

使用$.(参见perldoc perlvar)。

【讨论】:

从技术上讲,$. 不一定是行号;这是自该句柄的最后一个close(不是open)以来,在最后一个句柄上调用readline 运算符的次数。如果$/ 未设置为"\n"(例如"""\n%%\n",或者如果句柄在没有调用close 的情况下调用了open(如发生在ARGV,因此与 &lt;&gt;)。以及对于最后一行没有正确行终止顺序的文本文件是否有意义,我留给你自己考虑。 @tchrist:您对边缘情况的解释应该作为第三个答案发布在这里。 如果使用 ,perldoc eof 推荐 continue 的一部分 while(&lt;&gt;) ... 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 打开的文件的当前行号的主要内容,如果未能解决你的问题,请参考以下文章

Perl一行式:处理行号和单词数

如何在 Perl 中获取 MP3 文件的长度?

`死`时如何告诉行号?

如何使用sed的行号替换字符串

如何获取gridcontrol当前选中行的行号?

perl处理fasta文件