next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: El pragma use strict Sup: Subrutinas Ant: Variables privadas Err: Si hallas una errata ...

Variables Dinámicas

Las variables dinámicas se manejan mediante la palabra reservada 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.


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: El pragma use strict Sup: Subrutinas Ant: Variables privadas Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21