next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Control de Versiones Sup: Módulos Ant: Paquetes y ficheros Err: Si hallas una errata ...


Búsqueda de librerías y módulos

El fichero conteniendo el módulo o librería debe colocarse en uno de varios directorios estándar en los que el compilador busca (la variable de entorno PERL5LIB gobierna la búsqueda, también puedes usar la opción -I del compilador). 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 nereida, por ejemplo, el directorio exacto es /usr/lib/perl5/5.00503/Text/ParseWords.pm

El compilador Perl abre el primer fichero 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:

  1. Utilizar la opción -I de la línea de comandos. Por ejemplo:

    perl -I/home/casiano/perl/src/packages/ -I/usr/local/test/perl first.pl

  2. Definir la variable PERL5LIB como secuencia de caminos de acceso separados por el símbolo dos puntos (:)

  3. Modificar la variable @INC:
    unshift(@INC, '/home/casiano/perl/src/packages/');
    require 'mypackage.pl';
    

  4. Usar el módulo 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 la opción 4. También podemos hacerlo ``a mano'' escribiendo un código como:

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.


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Control de Versiones Sup: Módulos Ant: Paquetes y ficheros Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21