Reescribamos el módulo
del ejemplo anterior en un nuevo módulo HopsExport
:
package Modexample::HopsExport; use Exporter; @ISA = ('Exporter'); @EXPORT = qw(&hop_along); sub hop_along { my ($from, $to, $step) = @_; my $next = $from-$step; # incializar contador my $closure_ref = sub { $next += $step; return if $next > $to; $_[0] =$next; return 1; }; return $closure_ref; } 1;
El módulo Exporter
es el encargado de administrar la
interfase pública del módulo.
La inicialización del vector especial @ISA
hace que el módulo
Modexample::HopsExport
``herede'' del módulo Exporter
los métodos que nos hacen falta como import
.
Aún cuando no hemos visto objetos, puede dar una ojeada a
la sección 7.6 que trata sobre la herencia.
El método import
que proporciona Exporter
examina la lista en @EXPORT
para determinar que variables
se exportan por defecto.
¿Como hacer si tenemos rutinas que no queremos que forme parte de
la exportación por defecto pero que estén disponibles en caso de
que se soliciten explícitamente?
La alternativa es escribir los nombres de esos objetos en
la lista @EXPORT_OK
.
La línea de asignación
a la variable @EXPORT
hace que se cree un alias para
la función hop_along
en el programa cliente. De este modo
no es necesario llamar a la función por su nombre completo
Modexample::HopsExport::hop_along
sino simplemente
hop_along
.
#!/usr/bin/perl -w -I. use Modexample::HopsExport; $row = hop_along 1, 5, 1; while ($row->($r)) { $col = hop_along 1, 5, 1; while ($col->($c)) { print("($r, $c)\t"); } print "\n"; }
Veamos otro ejemplo. Supongamos el módulo:
package Trivial::Tutu; our @EXPORT = qw(uno dos); our @EXPORT_OK = qw(tres cuatro cinco); use Exporter; our @ISA = qw(Exporter);
Los siguientes ejemplos ilustran el modo de uso de la exportación:
use Trivial::Tutu;
Esto nos exportaría uno dos
.
use Trivial::Tutu qw(uno dos)
Lo mismo.
use Trivial::Tutu qw(tres cinco)
Ahora obtenemos tres cinco
. No se importan uno dos
.
use Trivial::Tutu();
No se importa ningún símbolo.
use Trivial::Tutu(siete);
Es un error. Todo símbolo importado debe estar
bien en la lista @EXPORT
bien en la lista
@EXPORT_OK
.
Observe que un programa cliente siempre puede acceder
a un símbolo del módulo, incluso si no figura como símbolo
exportable, sin mas que escribir su nombre completo (por
ejemplo Trivial::Tutu::siete
).