2012-03-27 12 views
7
use Modern::Perl; 
use DateTime; 
use autodie; 

my $dt; 

open my $fh, '<', 'data.txt'; 

# get the first date from the file 
while (<$fh> && !$dt) { 
    if (/^(\d+:\d+:\d+)/) { 
     $dt = DateTime->new(...); 
    } 
    print; 
} 

Estaba esperando que este ciclo lea cada línea del archivo hasta que se lea el primer valor de fecha y hora.

En su lugar, $ _ está unificado y recibo una carga de mensajes de "valor sin inicializar $ _ en correspondencia de patrones" (e impresión).

¿Alguna idea de por qué sucede esto?

Un

+0

ActiveState perl v5.14.1 – Richard

Respuesta

20

$_ sólo se establece si se utiliza el formulario de forma while (<$fh>), que no lo son.

vistazo a esto:

$ cat t.pl 
while (<$fh>) { } 
while (<$fh> && !$dt) { } 

$ perl -MO=Deparse t.pl 
while (defined($_ = <$fh>)) { 
    (); 
} 
while (<$fh> and not $dt) { 
    (); 
} 
t.pl syntax OK 

De los documentos perlop:

Normalmente debe asignar el valor devuelto a una variable, pero hay una situación en la que ocurre una asignación automática. Si y solo si el símbolo de entrada es el único dentro del condicional de una instrucción while (incluso si está disfrazada como un bucle for (;;)), el valor se asigna automáticamente a la variable global $ _, destruyendo cualquier estaba allí anteriormente.

+1

+1 for -MO = Deparse! – Richard

Cuestiones relacionadas