2012-02-21 10 views
5

estoy confundido en la siguiente:diferencia entre while frente a un solo uso del operador de diamantes en Perl

<>; print; 

vs

while(<>){print;} 

El primero no se imprime nada, pero segundo hace. ¿No almacena <> siempre la entrada leída en $_?

Gracias.

+1

La primera es en contexto escalar, ¿no? –

+0

@PaulTomblin: ¿Entonces? –

+0

'$ a = <>; print $ a; 'imprime la primera línea. Así que supongo que '<>;' no actualiza $ _. –

Respuesta

13

El iterador de entrada de archivo de diamantes sólo es mágico cuando está en la condición de un bucle while:

$ perl -MO=Deparse -e '<>; print;' 
<ARGV>; 
print $_; 
-e syntax OK 

$ perl -MO=Deparse -e 'while (<>) {print;}' 
while (defined($_ = <ARGV>)) { 
    print $_; 
} 
-e syntax OK 

Todo esto está documentado en perlop

8

No excepto como condición de una declaración while.

$ perl -MO=Deparse -e 'while(<>) { print }' 
while (defined($_ = <ARGV>)) { 
    print $_; 
} 
-e syntax OK 

$ perl -MO=Deparse -e '<>; print' 
<ARGV>; 
print $_; 
-e syntax OK 

perlop documentos que la asignación automática a $_ sólo ocurre en este contexto:

Normalmente debe asignar el valor devuelto a una variable, pero hay es una situación en la que ocurre una asignación automática . Si y solo si el símbolo de entrada es lo único dentro del condicional de una declaración "while" (incluso si está disfrazada como un bucle "for (;;)"), el valor es asignado automáticamente a la variable global $ _ , destruyendo lo que estaba allí anteriormente. (Esto puede parecer algo extraño para ti, pero usarás el constructo en casi todos los scripts de Perl que escribas). La variable $ _ no está implícitamente localizada. Tendrás que poner un "local $ _;" antes del ciclo si quieres que eso suceda.

2

De http://perldoc.perl.org/perlvar.html (Hablando $ _) :

"El lugar predeterminado para poner un registro de entrada cuando el resultado de una operación se prueba por sí mismo como el único criterio de una prueba while. Fuera de una prueba de tiempo, esto no sucederá bolígrafo."

Cuestiones relacionadas