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.
-
Defecto
@INC
El intérprete de Perl está compilado con un
@INC
valor por defecto. Para averiguar este valor, ejecuteenv -i perl -V
comandoenv -i
ignora elPERL5LIB
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
-
Variable ambiental
PERL5LIB
(oPERLLIB
)Pre-pendiente de Perl
@INC
con una lista de directorios (separados por dos puntos) contenidos enPERL5LIB
(si no está definido,PERLLIB
se utiliza) variable de entorno de su shell. Para ver el contenido de@INC
despuésPERL5LIB
yPERLLIB
las variables de entorno han surtido 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 comandosPre-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
(oPERLOPT
) variable de entorno (consulte el capítulo 19.02 en Programación en Perl)
-
-
Páselo a través del
lib
pragmaPre-pendiente de Perl
@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
víano lib
. -
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 unBEGIN
bloque, que precede aluse 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:
- perldoc perlmod
- perldoc lib
- Mecánica del módulo de Perl: una gran guía que contiene instrucciones prácticas
- ¿Cómo ‘uso’ un módulo Perl en un directorio que no está en
@INC
? - Programación de 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 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 usuariosPERL5LIB
, 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 deuse lib
/no lib
pragmas, luego use direct@INC
manipulación en el interiorBEGIN
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:
-
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 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.