2011-12-12 18 views

Respuesta

11

local ($ x) guarda distancia del antiguo valor de la variable global $ xy asigna un nuevo valor para la duración de la subrutina que es visible en otras funciones llamadas de esa subrutina. Esto se hace en tiempo de ejecución, por lo que se denomina ámbito dinámico. local() siempre afecta a variables globales, también llamadas variables de paquete o variables dinámicas.

mi ($ x) crea una nueva variable que sólo es visible en la corriente subrutina. Esto se realiza en tiempo de compilación, por lo que se denomina alcance estático léxico o . my() siempre afecta a las variables privadas, también llamadas variables léxicas o (incorrectamente) variables estáticas (ly scoped).

Tome un vistazo a la Perl-FAQ's:

+0

Muchas gracias – Anil

+6

"my ($ x) crea una nueva variable que solo es visible en la subrutina actual". Eso no es verdad. 'my' crea una nueva variable que solo es visible en el * bloque actual de código *. Una subrutina es solo un ejemplo de un bloque. Usted comete un error similar en su definición de 'local'. –

+0

@ O.D http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP

3

Voy a agregar un ejemplo rápido.

$var = "Global"; 

sub inner { 
    print "inner:   $var\n"; 
} 

sub changelocal { 
    my $var = "Local"; 
    print "changelocal: $var\n"; 

    &inner 
} 

sub changedynamic { 
    local $var = "Dynamic"; 
    print "changedynamic: $var\n"; 

    &inner 
} 

&inner 
&changelocal 
&changedynamic 

Esto da la siguiente salida (comentarios añadidos).

inner:   Global # Finds the global variable. 
changedynamic: DynamiC# Dynamic variable overrides global. 
inner:   DynamiC# Find dynamic variable now. 
changelocal: Local # Local variable overrides global. 
inner:   Global # The local variable is not in scope so global is found. 

Se puede pensar en una variable dinámica como una forma de enmascarar un global de las funciones que llamas. Donde las variables de ámbito léxico solo son visibles desde el código dentro de las llaves más cercanas.

Cuestiones relacionadas