2010-02-16 17 views

Respuesta

2

Usted recibirá una advertencia si una variable redeclare my, our o state en el alcance o el estado de cuenta actual. La primera $i no es en realidad una variable léxica. Puede probar esto usando Devel::Peek:

use Devel::Peek; 

for my $i (1) { 
    Dump $i; 
} 

SV = IV(0x81178c8) at 0x8100bf8 
REFCNT = 2 
FLAGS = (IOK,READONLY,pIOK) 
IV = 1 

No hay PADMY bandera de banderas, lo que indicaría que $i es una variable léxica, declarada con my.

9

En realidad, solo recibe advertencias para las redefiniciones en el mismo ámbito. Escritura:

use warnings; 
my $i; 
{ 
    my $i; 
    # do something to the inner $i 
} 
# do something to the outer $i 

es perfectamente válido.

no estoy seguro de si las partes internas de Perl manejan de esta manera, pero se puede pensar en su bucle for como se analiza como

{ 
    my $i; 
    for $i (...) { ... } 
    # the outer scope-block parens are important! 
};
+0

Su segundo ejemplo no es en absoluto lo mismo que la primera, debido a la diferente alcance, así como el iterador de bucle con alias a los elementos de la matriz (lo que significa que si cambia $ i dentro del bucle, cambiará su matriz, o generará una advertencia si los elementos son constantes). – Ether

+0

ambos están dentro del mismo alcance del bloque for mientras que sus ejemplos están en diferentes ámbitos. –

+0

El aliasing en el segundo ejemplo funciona como se espera, pruébelo usted mismo: my @a = (1 .. 3); {mi $ i; por $ i (1 .. 3) {$ i = 'x'; }} print "a: @a"; En cuanto a estar en el mismo ámbito: como muestra la pregunta, la declaración en la expresión para claramente no está en el mismo alcance que la declaración en el bloque interno. – willert

Cuestiones relacionadas