local
. En contra de lo
que pudiera parecer, no son variables locales.
Son variables globales (para ser mas precisos
variables de paquete o `package variables''
declaradas mediante our
o simplemente no declaradas)
cuyo valor es salvado y recuperado al finalizar
el bloque en el que se las ``localiza'' mediante local
.
Las variables localizadas mediante local
son globales y por tanto siguen
siendo accesibles desde cualquier subrutina. La localidad
se refiere al ambito temporal de su valor, pero no
a su visibilidad, que es global.
Así, la palabra local
debe entenderse
en el sentido de valor local (local value
).
Una aproximación a lo que ocurre cuando se declara una variable
local
es la equivalencia que se expresa en la siguiente tabla:
DECLARACIÓN DE local |
SIGNIFICADO |
{ local($SomeVar); $SomeVar = 'My Value'; ... } |
{ my $TempCopy = $SomeVar; $SomeVar = undef; $SomeVar = 'My Value'; ... $SomeVar = $TempCopy; } |
La diferencia entre variables dinámicas y léxicas debería quedar mas clara observando el siguiente ejemplo ...
> cat local.pl #!/usr/bin/perl -w sub pr { print "$a\n"; } sub titi { my $a = "titi"; pr(); } sub toto { local $a = "toto"; &pr(); &titi(); } $a = "global"; &pr(); &toto(); &titi();
...y su ejecución:
> local.pl global toto toto global
Ciertas variables son automáticamente
declaradas como dinámicas en la entrada a cada bloque, salvándose
así su valor. Es como si, el compilador pusiera una declaración local
automáticamente.
Por ejemplo, esto se hace con la variable índice de un bucle.
Esto es lo que permite el anidamiento de bucles como muestra el siguiente
ejemplo:
> cat nestedfors.pl #!/usr/bin/perl -w for (1..3) { for (0..4) { print "$_ "; } print ": $_\n"; } print "-----\n"; for $i (1..3) { for $i (0..4) { print "$i "; } print ": $i\n"; } > nestedfors.pl 0 1 2 3 4 : 1 0 1 2 3 4 : 2 0 1 2 3 4 : 3 ----- 0 1 2 3 4 : 1 0 1 2 3 4 : 2 0 1 2 3 4 : 3
Las variables especiales como $_
pueden ser calificadas ``local'' pero no pueden ser
calificadas con my.