A menudo queremos importar ciertos símbolos de un módulo en nuestro espacio
de nombres, para ahorrarnos pulsaciones: queremos escribir
sqrt
y no math::sqrt
.
Una vez que un módulo ha sido localizado y compilado dentro de un programa Perl como consecuencia
de una declaración use
, el siguiente paso es la ejecución de la subrutina import
de ese módulo. De hecho, la sentencia use module List
es equivalente a:
BEGIN {require module; module::import(module::import, List); }
La conducta por defecto de import
es vacía, pero podemos cambiar dicha conducta
creando en nuestro módulo nuestra propia subrutina import
.
Es decir, el módulo en cuestión tiene que estar preparado para exportar
esos identificadores al código cliente que los utiliza.
El uso de BEGIN
implica que require
e import
se ejecuten en el momento de
la compilación.
Cuando es llamada import
recibe como argumentos cualesquiera argumentos que aparezcan
despues de la sentencia use
. Por ejemplo, si un programa incluye una línea como:
use Technique::DandC::FFT ("sample");entonces, una vez localizado y compilado el módulo
Technique::DandC::FFT
se procede a la llamada de import
:
Technique::DandC::FFT::import("Technique::DandC::FFT", "sample");
Existe una declaración no que puede ser usada para desechar las importaciones realizadas
mediante use
:
no integer; no strict 'refs';La desactivación se mantendrá en el ámbito léxico de la declaración
no
.
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 3Para ello se tiene encuenta los siguientes puntos:
main
)
una entrada titi
.
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).
titi
en la tabla de símbolos
del paquete llamador hay que usar typeglobs y referenciado
simbólico.
no strict 'refs'
).
-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;
*{"$caller_package::titi"} = \&titi;¿Seguirá funcionando?