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.
Muchas gracias – Anil
"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'. –
@ O.D http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP