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:
El archivo /Library/Perl/x.xx/AppendToPath. Las rutas enumeradas en este archivo se agregan a @INC en tiempo de ejecución.
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.
Predeterminado
@INC
El intérprete de Perl se compila con un valor predeterminado específico de
@INC
. Para averiguar este valor, ejecute el comandoenv -i perl -V
(env -i
ignora la variable de entornoPERL5LIB
- 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
Variable ambiental
PERL5LIB
(oPERLLIB
)Perl pre-
@INC
con una lista de directorios (separados por dos puntos) contenidos en la variable de entornoPERL5LIB
(si no está definida, se usaPERLLIB
) de su shell. Para ver el contenido de@INC
después de que las variables de entornoPERL5LIB
yPERLLIB
hayan tenido efecto, ejecuteperl -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 .
-I
opción de línea de comandosPerl 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 entornoPERL5OPT
(oPERLOPT
) (consulte el capítulo 19.02 en Programación Perl )
Pásalo a través del
lib
pragmaPerl pre-
@INC
con una lista de directorios pasados a través deuse 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 deno lib
.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 bloqueBEGIN {}
, que precede a lause 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:
- Perldoc Perlmod
- Perldoc Lib
- Módulo de mecánica de Perl: una gran guía que contiene instrucciones prácticas.
- ¿Cómo ''uso'' un módulo Perl en un directorio que no
@INC
en@INC
? - Programación Perl - capítulo 31 parte 13, ch 7.2.41
- ¿Cómo sabe un programa Perl dónde encontrar el archivo que contiene el módulo Perl que utiliza?
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 elPERL5LIB
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 pragmasuse lib
/no lib
, use la manipulación directa@INC
dentro del bloqueBEGIN {}
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? ? ).