Las variables de paquete se pueden ''localizar'' mediante la
palabra reservada local
.
El valor de la variable es salvado y recuperado al finalizar
el bloque en el que se las ''localiza'' mediante local
.
Las variables localizadas mediante local
son de paquete y por tanto siguen
siendo accesibles desde cualquier subrutina. La localidad
se refiere al ambito temporal de su valor, 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 ...
lhp@nereida:~/Lperl/src$ cat -n local.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 our $x; 5 6 sub pr { print "$x\n"; } 7 sub titi { my $x = "titi"; pr(); } 8 sub toto { local $x = "toto"; &pr(); &titi(); } 9 10 $x = "global"; 11 &pr(); 12 &toto(); 13 &titi();
... y su ejecución:
> local.pl global toto toto global
Las variables especiales como $_
pertenecen al paquete
main::
y pueden ser calificadas con ''local'' pero no pueden ser
calificadas con my.
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