Perl permite acceder a la tabla de símbolos de un package Toto
mediane un hash denominado %Toto::
. Por ejemplo las variables del package main
estan accesibles a través del hash %main::
o también %::
.
Una estructura de este tipo recibe el nombre de stash (por Symbol Table Hash, la palabra stash tiene en inglés un significado similar a cache).
De este modo, es sencillo mostrar los identificadores usados en un paquete:
foreach $id (keys %Toto::) { print $id,"\n"; }
Cada uno de las claves es una entrada de la tabla de símbolos. Los correspondientes valores son typeglobs, los cuales apuntan a los diferentes tipos: escalar, array, etc.
Consideremos el siguiente código que contiene dos
paquetes: main
y toto
:
$ cat -n package_main.pl 1 #!/usr/local/bin/perl5.8.0 -w 2 3 $a = 4; 4 5 package toto; 6 $a = 8; 7 $::a = 7; 8 9 package main; 10 print $a, "\n"; 11 print $toto::a, "\n";La ejecución con el depurador muestra la estructura de un stash:
$ perl -d package_main.pl Loading DB routines from perl5db.pl version 1.25 main::(package_main.pl:3): $a = 4; # a de main DB<1> n toto::(package_main.pl:6): $a = 8; # a de toto DB<1> n toto::(package_main.pl:7): $::a = 7; DB<1> n main::(package_main.pl:10): print $a, "\n"; DB<1> x %toto:: 0 'a' # clave 1 *toto::a # valor DB<2> x $toto::{a} # indexamos 0 *toto::a DB<3> x *{toto::a}{SCALAR} # typeglob usado como hash 0 SCALAR(0x8163978) # referencia a un escalar -> 8 DB<4> x *{$toto::{a}}{SCALAR} 0 SCALAR(0x8163978) -> 8 DB<5> *b = $toto::{a} DB<6> p $b 8