tesis software sistemas resumen que proyecto operativos online libro libres libre libertades las ejemplos cuatro articulos perl perl-module

perl - sistemas - software libre online



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

¿Cuáles son todas las formas de afectar dónde se buscan los módulos de Perl? o, ¿cómo se construye el @INC de Perl ?

Como sabemos, Perl utiliza la matriz @INC contiene los nombres de directorio para determinar dónde buscar los archivos del módulo Perl .

No parece haber una publicación integral de preguntas frecuentes "@INC" en StackOverflow, por lo que esta pregunta está pensada como una.


Además de las ubicaciones mencionadas anteriormente, la versión OS X de Perl 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 agregan a @INC en tiempo de ejecución.


Como ya se dijo, @INC es una matriz y puede agregar cualquier cosa que desee.

Mi script REST CGI se parece a:

#!/usr/bin/perl use strict; use warnings; BEGIN { push @INC, ''fully_qualified_path_to_module_wiht_our_REST.pm''; } use Modules::Rest; gone(@_);

La subrutina ido se exporta por Rest.pm.


Veremos cómo se construyen los contenidos de esta matriz y se pueden manipular para afectar el lugar donde el intérprete de Perl encontrará los archivos del módulo.

  1. Predeterminado @INC

    El intérprete de Perl se compila con un valor predeterminado específico de @INC . Para averiguar este valor, ejecute el comando env -i perl -V ( env -i ignora la variable de entorno PERL5LIB - vea # 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 (comprobaciones de corrupción habilitadas) .

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

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

  1. Variable ambiental PERL5LIB (o PERLLIB )

    Perl pre- @INC con una lista de directorios (separados por dos puntos) contenidos en la variable de entorno PERL5LIB (si no está definida, se usa PERLLIB ) de su shell. Para ver el contenido de @INC después de que las variables de entorno PERL5LIB y PERLLIB hayan tenido 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

    Perl hace una @INC previa de @INC con una lista de directorios (separados por dos puntos) que se pasa como valor de la opción de línea de comandos -I . Esto se puede hacer de tres formas, como es habitual con las opciones de Perl:

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

      perl -I /my/moduledir your_script.pl

    • Pásalo a través de la primera línea (shebang) de tu script Perl:

      #!/usr/local/bin/perl -w -I /my/moduledir

    • PERL5OPT como parte de la variable de entorno PERL5OPT (o PERLOPT ) (consulte el capítulo 19.02 en Programación Perl )

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

    Perl pre- @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 través de no lib .

  4. Puede manipular directamente @INC como una matriz Perl normal.

    Nota: Dado que @INC se usa durante la fase de compilación, esto debe hacerse dentro de un bloque BEGIN {} , que precede a la use MyModule .

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

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

    • Haz cualquier otra cosa que puedas hacer con una matriz de Perl.

Nota: Los directorios no están desplazados en @INC en el orden indicado en esta respuesta, por ejemplo, @INC predeterminado es el último en la lista, precedido por PERL5LIB , precedido por -I , precedido por el use lib y la manipulación directa de @INC , los dos últimos mezclados En cualquier orden están en código Perl.

Referencias:

No parece haber una @INC integral de tipo @INC FAQ sobre , 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 en su sitio, especialmente ejecutados por múltiples usuarios, ese directorio debe incluirse en el @INC predeterminado 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 la recompilación de Perl no es una opción para cambiar @INC predeterminado en el caso de uso anterior), configure el PERL5LIB los usuarios, generalmente durante el usuario iniciar sesión.

    Nota: tenga en cuenta los escollos habituales de la variable de entorno Unix: por ejemplo, en ciertos casos, ejecutar los scripts como un usuario en particular no garantiza ejecutarlos con la configuración del entorno de ese usuario, por ejemplo, a través de su .

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

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

  • Si los directorios en @INC necesitan ser manipulados de acuerdo con alguna lógica complicada, ya sea imposible o muy poco manejable de implementar mediante la combinación de pragmas use lib / no lib , use la manipulación directa @INC dentro del bloque BEGIN {} o dentro de una biblioteca de propósito especial designado para la manipulación de @INC , que debe ser utilizado por su (s) script (s) antes de usar cualquier otro módulo.

    Un ejemplo de esto es el cambio automático de bibliotecas en los directorios prod / uat / dev, con la recolección de la biblioteca de 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. A La ilustración detallada de este escenario se encuentra en ¿Cómo uso los módulos de Perl beta de los scripts de Perl beta?

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