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

Si desea leer una línea en la línea $, a continuación, leer una línea en línea de $ en vez de leer una línea en alguna otra variable y luego copiarlo en línea $: mientras que (mi línea de $ = <$fp>) { – tadmc

+1

@tadmc : o más bien 'while (defined (my $ line = <$fp>)) {...}', ya que la última línea podría ser cero y no terminar en una nueva línea. – phaylon

Respuesta

38

Uso $. (ver perldoc perlvar).

+25

Muy técnicamente, '$ .' no es necesariamente el número de línea; es la cantidad de veces que se ha llamado al operador 'readline' en el último manejador al que se llamó desde el último' close' (no 'open') del manejador. No reflejaría las líneas si '$ /' no está configurado en '" \ n "' (como '" "' o '" \ n %% \ n "', o si se ha llamado al comando 'open' sin una llamada a 'cerrar' (como ocurre con' ARGV', y por lo tanto con '<>'). Y si es significativo para los archivos de texto con líneas lastimadas que no tienen una secuencia de terminación de línea adecuada en ellos I váyase para su propia contemplación. – tchrist

+6

@tchrist: Su explicación de los casos límite debería haberse publicado como tercera respuesta aquí. – Dallaylaen

+3

[perldoc eof] (http://perldoc.perl.org/functions/eof.html) recomienda el 'continuar 'parte de' while (<>) {...} continuar {cerrar ARGV si eof} 'si usa <>, abordar una de las buenas advertencias de @ tchrist. –

13

También puede hacerlo a través de la interfaz OO:

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

Esto está en perldoc perlvar, también.

+5

Eso está sujeto a las mismas advertencias que acabo de delinear para' $ .', por supuesto. – tchrist

Cuestiones relacionadas