Saltar al contenido

¿Cómo se construye el @INC de Perl? (también conocido como ¿Cuáles son todas las formas de afectar dónde se buscan los módulos Perl?)

Te damos la bienvenida a proyecto online, en este lugar vas a hallar la respuesta a lo que estás buscando.

Solución:

Veremos cómo el contenido de este array se construyen y se pueden manipular para afectar dónde el intérprete de Perl encontrará los archivos del módulo.

  1. Defecto @INC

    El intérprete de Perl está compilado con un @INC valor por defecto. Para averiguar este valor, ejecute env -i perl -V comandoenv -i ignora el PERL5LIB variable ambiental – vea el n. ° 2) y en la salida verá algo como esto:

    $ env -i perl -V
    ...
    @INC:
     /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/site_perl/5.18.0
     /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/5.18.0
     .
    

Nota . al final; este es el directorio actual (que no es necesariamente el mismo que el directorio del script). Falta en Perl 5.26+, y cuando Perl se ejecuta con -T (verificaciones de contaminación habilitadas).

Para cambiar la ruta predeterminada al configurar la compilación binaria Perl, establezca la opción de configuración otherlibdirs:

Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3

  1. Variable ambiental PERL5LIB (o PERLLIB)

    Pre-pendiente de Perl @INC con una lista de directorios (separados por dos puntos) contenidos en PERL5LIB (si no está definido, PERLLIB se utiliza) variable de entorno de su shell. Para ver el contenido de @INC después PERL5LIB y PERLLIB las variables de entorno han surtido efecto, ejecute perl -V.

    $ perl -V
    ...
    %ENV:
      PERL5LIB="/home/myuser/test"
    @INC:
     /home/myuser/test
     /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/site_perl/5.18.0
     /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/5.18.0
     .
    
  2. -I opción de línea de comandos

    Pre-pendiente de Perl @INC con una lista de directorios (separados por dos puntos) pasados ​​como valor del -I opción de línea de comandos. Esto se puede hacer de tres formas, como es habitual con las opciones de Perl:

    • Páselo en la línea de comando:

      perl -I /my/moduledir your_script.pl
      
    • Páselo a través de la primera línea (shebang) de su script de Perl:

      #!/usr/local/bin/perl -w -I /my/moduledir
      
    • Pásalo como parte de PERL5OPT (o PERLOPT) variable de entorno (consulte el capítulo 19.02 en Programación en Perl)

  3. Páselo a través del lib pragma

    Pre-pendiente de Perl @INC con una lista de directorios pasados ​​a través de use lib.

    En un programa:

    use lib ("/dir1", "/dir2");
    

    En la línea de comando:

    perl -Mlib=/dir1,/dir2
    

    También puede eliminar los directorios de @INC vía no lib.

  4. Puedes manipular directamente @INC como un Perl regular array.

    Nota: Desde @INC se utiliza durante la fase de compilación, esto debe hacerse dentro de un BEGIN bloque, que precede al use MyModule declaración.

    • Agregue directorios al principio a través de unshift @INC, $dir.

    • Agregue directorios al final a través de push @INC, $dir.

    • Haga cualquier otra cosa que pueda hacer con un Perl array.

Nota: los directorios son sin cambiar sobre @INC en el orden indicado en esta respuesta, por ejemplo, predeterminado @INC es el último en la lista, precedido por PERL5LIB, precedido por -I, precedido por use lib y directo @INC manipulación, los dos últimos mixed en cualquier orden en que estén en código Perl.

Referencias:

No parece haber una amplia @INC Publicación de tipo FAQ en Stack Overflow, por lo que esta pregunta está pensada como una.

¿Cuándo usar cada enfoque?

  • Si los módulos de un directorio deben ser utilizados por muchos / todos los scripts de su sitio, especialmente ejecutados por varios usuarios, ese directorio debe incluirse en el archivo predeterminado. @INC compilado en el binario de Perl.

  • Si los módulos en el directorio serán utilizados exclusivamente por un usuario específico para todos los scripts que ejecuta el usuario (o si recompilar Perl no es una opción para cambiar el valor predeterminado @INC en el caso de uso anterior), configure los usuarios PERL5LIB, generalmente durante el inicio de sesión del usuario.

    Nota: tenga en cuenta los errores habituales de las variables de entorno de Unix; por ejemplo, en ciertos casos, ejecutar los scripts como un usuario en particular no garantiza ejecutarlos con el entorno de ese usuario configurado, por ejemplo, a través de su.

  • Si los módulos en el directorio deben usarse solo en circunstancias específicas (por ejemplo, cuando el script (s) se ejecuta en modo de desarrollo / depuración, puede configurar PERL5LIB manualmente, o pasar el -I opción a perl.

  • Si los módulos deben usarse solo para scripts específicos, por todos los usuarios que los usan, usan use lib/no lib pragmas en el propio programa. También debe usarse cuando el directorio que se buscará necesita ser determinado dinámicamente durante el tiempo de ejecución, por ejemplo, a partir de los parámetros de la línea de comandos del script o la ruta del script (consulte el módulo FindBin para un caso de uso muy agradable).

  • Si los directorios en @INC necesitan ser manipulados de acuerdo con una lógica complicada, ya sea imposible o demasiado difícil de implementar mediante una combinación de use lib/no lib pragmas, luego use direct @INC manipulación en el interior BEGIN bloque o dentro de una biblioteca de propósito especial designado para @INC manipulación, que debe usar su (s) script (s) antes de que se usen otros módulos.

    Un ejemplo de esto es cambiar automáticamente entre bibliotecas en los directorios prod / uat / dev, con la recogida de la biblioteca en cascada en prod si falta en dev y / o UAT (la última condición hace que la solución estándar “use lib + FindBin” sea bastante complicada. La ilustración detallada de este escenario está en ¿Cómo utilizo los módulos beta de Perl de los scripts beta de Perl?.

  • Un caso de uso adicional para manipular directamente @INC es poder agregar referencias a subrutinas o referencias a objetos (sí, Virginia, @INC puede contener código Perl personalizado y no solo nombres de directorio, como se explica en ¿Cuándo se llama una referencia de subrutina en @INC?).

Además de las ubicaciones enumeradas anteriormente, la versión de Perl para OS X también tiene dos formas más:

  1. El archivo /Library/Perl/x.xx/AppendToPath. Las rutas enumeradas en este archivo se agregan a @INC en tiempo de ejecución.

  2. El archivo /Library/Perl/x.xx/PrependToPath. Las rutas enumeradas en este archivo se anteponen a @INC en tiempo de ejecución.

Como ya se dijo @INC es un array y eres libre de agregar lo que quieras.

Mi script CGI REST se ve así:

#!/usr/bin/perl
use strict;
use warnings;
BEGIN 
    push @INC, 'fully_qualified_path_to_module_wiht_our_REST.pm';

use Modules::Rest;
gone(@_);

Rest.pm exporta la subrutina perdida.

Te mostramos las comentarios y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *