use module
se produce la búsqueda
por el fichero conteniendo module
.
El fichero conteniendo el módulo o
librería debe colocarse en uno de varios directorios estándar
en los que el compilador busca. Esa lista esta disponible
en un programa Perl a través de la variable @INC
.
Así puedes ver el camino de búsqueda escribiendo:
$ perl -e 'print "@INC\n";' /usr/local/lib/perl/5.6.1 /usr/local/share/perl/5.6.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.6.1 /usr/share/perl/5.6.1 /usr/local/lib/site_perl .si tienes mas de una versión de Perl, puede que difieran en sus caminos de búsqueda:
$ perl5.8.0 -e 'print "@INC\n";' /usr/local/lib/perl5/5.8.0/i686-linux /usr/local/lib/perl5/5.8.0 /usr/local/lib/perl5/site_perl/5.8.0/i686-linux /usr/local/lib/perl5/site_perl/5.8.0 /usr/local/lib/perl5/site_perl .Otra posibilidad es llamar a Perl con la opción
-V
(versión):
$ perl5.8.0 -V Summary of my perl5 (revision 5.0 version 8 subversion 0) configuration: ... Characteristics of this binary (from libperl): Compile-time options: USE_LARGE_FILES Built under linux Compiled at May 14 2003 16:02:03 @INC: /usr/local/lib/perl5/5.8.0/i686-linux /usr/local/lib/perl5/5.8.0 /usr/local/lib/perl5/site_perl/5.8.0/i686-linux /usr/local/lib/perl5/site_perl/5.8.0 /usr/local/lib/perl5/site_perl .
El compilador
sustituye cada ::
por el separador de caminos. Asi la orden:
use Text::ParseWords;
se traduce por el fichero
Text/ParseWords.pm
. En cierta máquina el directorio exacto
podría ser algo similar a /usr/lib/perl5/5.00503/Text/ParseWords.pm
El compilador Perl abre el primer fichero en el camino de búsqueda
que case con Text/ParseWords.pm
y evalúa
el texto en su interior. Si falla, la compilación termina con un mensaje de error.
En otro caso, el compilador busca en el módulo por una rutina denominada import y si existe la ejecuta.
Cuando esta termina la compilación
continúa en el fichero original, justo después de la línea en la que aparece la sentencia use
.
Si queremos especificar directorios adicionales de búsqueda podemos optar por una de estas opciones:
-I
de la línea de comandos. Por ejemplo:
perl -I/home/casiano/perl/src/packages/ -I/usr/local/test/perl first.pl
PERL5LIB
como secuencia de caminos de acceso
separados por el símbolo dos puntos (:
)
@INC
:
unshift(@INC, '/home/casiano/perl/src/packages/'); require 'mypackage.pl';
lib
el cual añade los
caminos especificados como argumentos en tiempo
de compilación:
#!/usr/local/bin/perl5.8.0 -w use lib qw(/home/lhp/perl/src /home/lhp/public_html/cgi-bin); print "@INC \n";Al ejecutar nos da:
bash-2.05b$ ./use_lib.pl /home/lhp/perl/src /home/lhp/public_html/cgi-bin /usr/local/lib/perl5/5.8.0/i686-linux /usr/local/lib/perl5/5.8.0 /usr/local/lib/perl5/site_perl/5.8.0/i686-linux /usr/local/lib/perl5/site_perl/5.8.0 /usr/local/lib/perl5/site_perl .
Si se quiere garantizar que el camino en cuestión esta disponible antes de que se ejecute ninguna sentencia se puede usar una de las opciones 1 2 o 4. También podemos hacerlo rodeando la opción 3 de un BEGIN:
BEGIN { unshift @INC, "home/lhp/perl/src"; }
Cuando Perl esta en la fase de compilación y encuentra un bloque con nombre BEGIN pasa a ejecutarlo y continúa con la compilación. Puede existir mas de un bloque BEGIN en un programa, en cuyo caso se van ejecutando durante la fase de compilacion según se van viendo.
casiano@beowulf:~/src/perl$ perl -de 0 DB<1> require Data::Dumper DB<2> require "Data::Dumper" Can't locate Data::Dumper in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at (eval 18)[/usr/share/perl/5.8/perl5db.pl:628] line 2.Observe que el primer
require
no produce ninguna queja, el segundo si. Consulte
perldoc -f require
para entender este detalle.