2011-05-07 65 views
20
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; 
+4

如果你想读取一行到$ line,然后读取一行到$行,而不是读入一些其他变量的行,然后将其复制到$ line:while(my $ line = <$fp>){ – tadmc 2011-05-07 13:49:33

+1

@tadmc :或者'while(defined(my $ line = <$fp>)){...}',因为最后一行可能是零而不是以换行符结束。 – phaylon 2011-05-08 17:08:54

回答

38

使用$.(参见perldoc perlvar)。

+25

从技术上讲,'$ .'不一定是行号;它是readline操作符被调用的最后一个句柄被调用的次数,因为该句柄的最后一个'close'(而不是'open')。如果'$ /'没有设置为'“\ n”'(例如''“'或'”\ n %% \ n“',或者如果句柄已经打开,它不会反映行它没有调用'close'(与'ARGV'一起发生,因此用'<>');而且对于没有正确行终止顺序的文本文件, – tchrist 2011-05-07 16:46:43

+6

@tchrist:你对边缘案例的解释应该在这里作为第三个答案发布。 – Dallaylaen 2011-05-08 17:41:30

+3

[perldoc eof](http://perldoc.perl.org/functions/eof.html)建议'继续如果使用<>,那么while(<>){...}继续{关闭ARGV if if eof}',解决@ tchrist的一个好告诫 – 2015-04-22 21:16:18

13

你也可以做到这一点通过OO接口:

use IO::Handle; 
# later on ... 
my $n = $fp->input_line_number(); 

这是perldoc perlvar了。

+5

这与我刚刚提到的$当然。“ – tchrist 2011-05-07 16:48:10