El intérprete Perl (que ejecuta su programa perl) utilizará una matriz especial llamada @INC
para buscar un archivo que contenga el módulo.
Cada valor en la matriz @INC
es un nombre de directorio (pero vea la nota a continuación); Perl buscará dentro de esos directorios en un bucle utilizando las reglas especificadas a continuación. (Por favor, consulte this SO post for details of how the contents of @INC are determined).
Si no se encuentra el archivo del módulo después de agotar @INC
, la compilación del programa se cancelará con un error. Si el archivo del módulo se encuentra en uno de los directorios especificados en @INC
, la búsqueda finaliza sin mirar el resto de @INC
.
La forma en que Perl busca un archivo módulo dentro de cada uno de los directorios listados en @INC
es el siguiente:
En primer lugar, se separará componentes jerárquicos del nombre del módulo (palabras separadas por ::
), en el último componente, que se usará para formar un nombre de archivo, y una ruta de jerarquía (todos los componentes anteriores al último ::
).
En caso de que el nombre del módulo tenga solo un componente (no ::
, por ejemplo, MyModule1
), la ruta de la jerarquía está vacía y el nombre del archivo es el nombre del módulo. En el segundo ejemplo de esta pregunta, el último componente es MyModule2
y la ruta jerárquica será This::Here
.
El nombre del archivo esperado se determinará al agregar el último componente del nombre del módulo con una extensión .pm
. P.ej. MyModule1.pm
y MyModule2.pm
en nuestros ejemplos.
NOTA: Los nombres de los módulos obviamente distinguen entre mayúsculas y minúsculas en Unix y en otros sistemas operativos donde el nombre de archivo/directorio distingue entre mayúsculas y minúsculas.
directorio del módulo será determinado por:
Tomando el siguiente directorio de @INC
- digamos /usr/lib/perl
como ejemplo
La formación de un subdirectorio de ese directorio mediante la adopción de la jerarquía ruta del nombre del módulo (si lo hay) y reemplazando "::" con /
o cualquier carácter que el sistema operativo use como separador de directorio. En nuestros dos ejemplos, el primer módulo se buscará en /usr/lib/perl
(sin subdirectorio) y el segundo en /usr/lib/perl/This/Here
.
NOTA: lo anterior es una ligera simplificación - @INC
may also contain subroutine references and object references, que cargan los módulos como su código personalizado especifica en lugar de realizar la búsqueda en el directorio especificado en el # 2 lógica anterior. Esa funcionalidad parece ser muy poco utilizada y este artículo asume que todo @INC
solo contiene directorios.
Repasemos un ejemplo específico, en el supuesto de que su @INC
contiene dos subdirectorios: ("/usr/lib/perl", "/opt/custom/lib")
.
Entonces Perl sería buscar la siguiente manera:
==========================================================================
| Module | Try # | File to try
==========================================================================
| MyModule1 | Try 1 | /usr/lib/perl/MyModule1.pm
| MyModule1 | Try 2 | /opt/custom/lib/MyModule1.pm
==========================================================================
| This::Here::MyModule2 | Try 1 | /usr/lib/perl/This/Here/MyModule2.pm
| This::Here::MyModule2 | Try 2 | /opt/custom/lib/This/Here/MyModule2.pm
==========================================================================
Por favor, recuerde que Perl intérprete dejará de intentar buscar una vez que encuentra el archivo en uno de los lugares, sin tratar de ver si el archivo está en ubicaciones posteriores también. P.ej. si existe /usr/lib/perl/This/Here/MyModule2.pm
, entonces Perl no buscará ni le importará la existencia de /opt/custom/lib/This/Here/MyModule2.pm
.
NOTA: @INC se usa cuando el intérprete de Perl utiliza el mecanismo similar a require
para importar módulos Perl. Esto incluye:
require
propia directiva
use MyModule
declaración (equivalente a requerir + importaciones)
use base
(equivalente a requerir + "empujar @ISA")
No pude encontrar una respuesta completa a esta pregunta en SO a la que pudiera vincular, así que decidí crear una. Si la respuesta proporcionada a continuación necesita adiciones/correcciones, por favor tenga en ella :) – DVK