Perl interpreter (che esegue il programma perl) utilizzerà uno speciale array denominato @INC
per cercare un file contenente il modulo.
Ogni valore nell'array @INC
è un nome di directory (ma vedere la nota sotto); Perl cercherà all'interno di quelle directory in un ciclo utilizzando le regole specificate di seguito. (Si prega di fare riferimento a this SO post for details of how the contents of @INC are determined).
Se il file del modulo non viene trovato dopo aver esaurito @INC
, la compilazione del programma viene interrotta con un errore. Se il file del modulo viene trovato in una delle directory specificate in @INC
, la ricerca è terminata senza guardare il resto di @INC
.
Il modo in cui Perl cerca un file modulo all'interno di ciascuna delle directory elencate nella @INC
è la seguente:
In primo luogo, sarà separare le componenti gerarchici del nome del modulo (parole separate da ::
), in ultimo componente - che verrà utilizzato per formare un nome file - e un percorso gerarchico (tutti i componenti precedenti l'ultimo ::
).
Nel caso in cui il nome del modulo abbia un solo componente (no ::
, ad esempio MyModule1
sopra), il percorso della gerarchia è vuoto e il nome file è il nome del modulo. Nel secondo esempio di questa domanda, l'ultimo componente è MyModule2
e il percorso della gerarchia sarà This::Here
.
Il nome del file previsto verrà determinato aggiungendo l'ultimo componente del nome del modulo con un'estensione .pm
. Per esempio. MyModule1.pm
e MyModule2.pm
nei nostri esempi.
NOTA: i nomi dei moduli sono ovviamente sensibili alla distinzione tra maiuscole e minuscole su Unix e altri sistemi operativi in cui la denominazione di file/directory fa distinzione tra maiuscole e minuscole.
directory del modulo sarà determinato da:
Prendendo la directory successiva da @INC
- diciamo /usr/lib/perl
come esempio
Formare una sottodirectory di quella directory prendendo la gerarchia percorso del nome del modulo (se presente) e sostituzione di "::" con /
o qualsiasi altro carattere che il sistema operativo utilizza come separatore di directory. Nei nostri due esempi, il primo modulo verrà cercato in /usr/lib/perl
(nessuna sottodirectory) e il secondo in /usr/lib/perl/This/Here
.
NOTA: quanto sopra è una leggera semplificazione - @INC
may also contain subroutine references and object references, che caricare i moduli come il loro codice personalizzato specifica invece di eseguire la ricerca nella directory come specificato nel # 2 logica sopra. Questa funzionalità sembra essere utilizzata raramente e in questo articolo si presuppone che l'intero @INC
contenga solo le directory.
Andiamo su un esempio specifico, partendo dal presupposto che il vostro @INC
contiene due sub-directory: ("/usr/lib/perl", "/opt/custom/lib")
.
Poi Perl cercherebbe come segue:
==========================================================================
| 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
==========================================================================
Si prega di ricordare che Perl interprete smettere di cercare di cercare una volta che trova il file in una delle posizioni, senza cercare di capire se il file è in posizioni successive anche. Per esempio. se esiste /usr/lib/perl/This/Here/MyModule2.pm
, allora Perl non cercherà, né si preoccuperà dell'esistenza, di /opt/custom/lib/This/Here/MyModule2.pm
.
NOTA: @INC viene utilizzato ogni volta interprete Perl utilizza require
-come meccanismo per l'importazione moduli Perl. Ciò include:
require
direttiva stessa
use MyModule
economico (equivalente a richiedere + import)
use base
(equivalente a richiedere + "push @ISA")
Non riuscivo a trovare una risposta esaustiva a questa domanda su SO a cui potevo collegarmi, quindi ho deciso di crearne uno. Se la risposta fornita di seguito ha bisogno di aggiunte/correzioni, si prega di avere a questo :) – DVK