Importación

Que es Importar

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.

La Subrutina import

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.

Argumentos de import

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");

Aprenda a Decir no

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.

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?



Subsecciones
Casiano Rodríguez León
2009-10-04