Tablas de Símbolos y Packages

Cada package tiene su propia tabla de símbolos. Así para acceder a una variable es preciso especificar de que tabla se habla (el package) y de que variable se habla (identificador dentro de la tabla). Las variables en el package main pueden ser referidas prefijándolas con ::; así el programa:
$ cat package_main.pl
#!/usr/local/bin/perl5.8.0 -w

$a = 4;

package toto;
$a = 8;
$::a = 7;

package main;
print $a, "\n";
print $toto::a, "\n";
produce como salida:
$ ./package_main.pl
7
8

Las Variables Especiales Pertenecen a main

Una excepción a esto la constituye las variables especiales como $_, @ARGV, %ENV, etc. Estas pertenecen siempre al paquete main.

  1 #!/usr/local/bin/perl5.8.0 -w
  2
  3 package toto;
  4 $_ = 7;
  5 package main;
  6 print;
  7 print "\n";
  8 $main::_ = 4;
  9 print;
 10 print "\n";
Da como salida:
$ ./package_specialvars.pl
7
4

Variables Léxicas y Scratchpads

Las variables léxicas (declaradas con my) no se introducen en las tablas de símbolos de los paquetes. En estas sólo van las variables globales. Cada bloque y subrutina tienen su propia tabla de símbolos, que se denominan en la jerga Perl scratchpads. A cada variable léxica se le asigna una ranura en el scratchpad. Por supuesto, como las variables léxicas no van en las tablas de símbolos sino en los scratchpads, no tiene sentido prefijarlas con un identificador de paquete.

Ejercicio 5.2.1   Explique la salida del siguiente programa:
lhp@nereida:~/Lperl/src$ cat -n privacy.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  package tutu;
 4  my $a = 10;
 5
 6  package titi;
 7
 8  if (defined($tutu::a)) { print "$tutu::a\n" }
 9  else { print "No esta definida \$tutu::a\n"};
10  print "\$a = $a\n";



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