2011-05-07 50 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

相關問題