El uso de local

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).

Semántica de local

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;
}


Ejemplo

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

Localización de las Variables Mágicas

Las variables especiales como $_ pertenecen al paquete main:: y pueden ser calificadas con ''local'' pero no pueden ser calificadas con my.

Localización Automática

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



Subsecciones
Casiano Rodríguez León
2009-10-04