next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Práctica: Stash Sup: Módulos Ant: Importación Err: Si hallas una errata ...

Acceso a la tabla de símbolos

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



Subsecciones
next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Práctica: Stash Sup: Módulos Ant: Importación Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21