Práctica: Stash

Escriba una subrutina que vuelque los contenidos de las variables (escalar, array, hash) que están definidas en el paquete cuyo nombre se le pasa como parámetro a dicha subrutina. La capacidad de poder acceder y modificar la tabla de símbolos en tiempo de ejecución se denomina introspección.

Por ejemplo, dado el paquete Test:

lhp@nereida:~/Lperl/src/advanced_perl_programming/Typeglob$ cat -n dumpvar.pl
41  package Test;
42  our $x = 10;
43  our @y = (1,3,4);
44  our %z = (1,2,3,4, 5, 6);
45  our $z = 300;
46  our $f = sub { 1; };

la llamada:

48  DumpPackage::dumpackage("Test");

producirá una salida similar a:

lhp@nereida:~/Lperl/src/advanced_perl_programming/Typeglob$ dumppackage.pl
y
        Lista @y: [
          1,
          3,
          4
        ]
=============================
__ANON__
=============================
x
        Escalar $x:     10
=============================
f
        Escalar $f: sub {
            package Test;
            use strict 'refs';
            1;
        }
=============================
z
        Escalar $z:     300
        Hash %z: {
          1 => 2,
          3 => 4,
          5 => 6
        }
=============================

Para imprimir una estructura de datos compleja existen varias soluciones. Puede usar el módulo Data::Dumper para volcar las estructuras de datos resultantes. Consulte la documentación del módulo.

Puede partir del esqueleto que sigue. Las líneas de puntos indican lugares en los que deberá insertar el código apropiado.

lhp@nereida:~/Lperl/src/advanced_perl_programming/Typeglob$ cat -n dumppackage.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3
 4  package DumpPackage;
 5  use Data::Dumper;
 6
 7  $Data::Dumper::Terse = 1;
 8  $Data::Dumper::Deparse = 1;
 9
10  sub dumpackage {
11      my ($packageName) = @_;
12      my $rPackage;
13      {
14        .................
15        $rPackage = \%{"${packageName}::"};  # Obtener la referencia al stash
16      }
17      $, = " ";
18      while (my ($varName, $globValue) = each %$rPackage) {
19          print "$varName\n";
20          our ($..., @..., %...);
21          *var = $globValue; # Crear un alias
22          if (defined ($var)) {
..              ..................................
25          }
26          if (defined (@var)) {
..              ..................................
30          }
31          if (defined (%var)) {
..              ..................................
35          }
36          print "============================= \n";
37      }
38  }

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19