如何使用Perl打开文件的当前行号?

Laz*_*zer 27 perl file

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;
Run Code Online (Sandbox Code Playgroud)

nin*_*alj 45

使用$.(见perldoc perlvar).

  • 从技术上讲,`$ .`不一定是行号; 它是`readline`操作符在被调用的最后一个句柄上被调用的次数,因为该句柄的最后一个'close`(不是'open`).如果`$ /`没有设置为`"\n"`(例如````或``\n %% \n"`,或者如果句柄有'open`被调用,它就不会反映行它没有调用`close'(就像'ARGV`一样,因此带有`<>`).对于带有错位的最后一行没有正确行终止序列的文本文件是否有意义我离开你自己的沉思. (30认同)
  • @tchrist:你对边缘案例的解释应该在这里作为第三个答案发布. (7认同)
  • [perldoc eof](http://perldoc.perl.org/functions/eof.html)建议`while(<>){...}的`continue`部分继续{关闭ARGV if eof}`如果使用< >,解决@ tchrist的一个好警告. (3认同)

Dal*_*aen 14

您也可以通过OO界面完成:

use IO::Handle;
# later on ...
my $n = $fp->input_line_number();
Run Code Online (Sandbox Code Playgroud)

这也是perldoc perlvar.

  • 当然,这与我刚才为`$ .`概述的注意事项有关. (5认同)