Ejemplo

Supongamos que queremos que la subrutina import del módulo myimport.pm que se define mas abajo exporte su función titi al espacio de nombres del package llamador, de manera que cuando se ejecute el siguiente programa usemyimport.pl:

$ cat -n ./usemyimport.pl
 1  #!/usr/bin/perl -w -I.
 2  use strict;
 3  use myimport;
 4
 5  my $titi = 4;
 6  my @titi = (1,2,3);
 7  &titi();
 8
 9  print"$titi\n";
10  print"@titi\n";

de lugar a la salida:

$ ./usemyimport.pl
Hola
4
1 2 3
Para ello se tiene encuenta los siguientes puntos:
  1. Hay que instalar en la tabla de símbolos del paquete llamador (que no forzosamente es el paquete main) una entrada titi.
  2. Para instalar titi hay que averiguar el nombre del paquete llamador. La función caller devuelve el ''package'' desde el cuál fue llamada la subrutina (sección 1.15.10).
  3. Para instalar la entrada titi en la tabla de símbolos del paquete llamador hay que usar typeglobs y referenciado simbólico.
  4. Minimizamos el periodo de desactivación de control estricto del referenciado simbólico (no strict 'refs').
  5. Observe el uso de la opción -I. en la primera línea del programa cliente usemyimport.pl: garantiza que el intérprete perl encontrará el módulo ./myimport.pm.

lhp@nereida:~/Lperl/src$ cat -n myimport.pm
 1  package myimport;
 2  use strict;
 3
 4  sub titi {
 5    print "Hola\n";
 6  }
 7
 8  sub import {
 9
10    my ($caller_package) = caller;
11    {
12      no strict 'refs';
13      *{$caller_package."::titi"} = \&titi;
14    }
15  }
16
17  1;

Ejercicio 5.7.1   Explique que ocurre si cambiamos la línea 13 por
*{"$caller_package::titi"} = \&titi;
¿Seguirá funcionando?

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