Domanda

Se il mio programma Perl utilizza moduli Perl, come intende determinare dove trovare il file che contiene il codice del modulo?

Ad esempio, se il programma contiene:

use MyModule1;              # Example 1
use This::Here::MyModule2;  # Example 2

dove sarà?

È stato utile?

Soluzione

interprete Perl (che esegue il programma Perl) userà una serie speciale chiamata @INC per cercare un file che contiene il modulo.

Ogni valore nella matrice @INC è un nome di directory ( ma vedi nota sotto ); Perl cercherà all'interno di queste directory in un ciclo utilizzando le regole di seguito specificate. (Si prega di fare riferimento a questo SO postale per i dettagli su come il contenuto di @INC sono determinati ).

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 si trova in una delle directory specificate nel @INC, la ricerca è terminata senza guardare il resto della @INC.

Il modo in cui Perl cerca un file modulo all'interno di ciascuna delle directory elencate nella @INC è la seguente:

  • In primo luogo, si separerà componenti gerarchici del nome del modulo (parole separate da ::), in ultimo componente - che sarà utilizzato per formare un nome di file - e un percorso gerarchico (tutti i componenti che precede l'ultimo :: ).

    Nel caso il nome del modulo ha solo un componente (senza ::, ad esempio MyModule1 sopra), il percorso di gerarchia è vuota e il nome del file è il nome del modulo. Nel secondo esempio, in questa domanda, l'ultima componente è MyModule2 e la gerarchia percorso verrà This::Here.

  • Il nome del file previsto sarà determinata 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 tra maiuscole e minuscole su altri sistemi operativi Unix e dove file / directory di denominazione è case sensitive

  • La directory del modulo sarà determinato da:

    1. Prendendo la prossima directory da @INC - diciamo /usr/lib/perl come esempio

    2. La formazione di una sottodirectory di quella directory prendendo il percorso della gerarchia del nome del modulo (se presente) e la sostituzione "::" con / o qualunque sia il carattere del sistema operativo utilizza come separatore di directory. Nei nostri due esempi, il primo modulo verrà cercato in /usr/lib/perl (nessun sub-directory) e la seconda in /usr/lib/perl/This/Here.

    3. NOTE : quanto sopra è una leggera semplificazione - @INC può anche contenere riferimenti a subroutine ei riferimenti agli oggetti , che caricare i moduli come il loro codice personalizzato specifica invece di eseguire la ricerca nella directory come specificato nel # 2 logica sopra. Che la funzionalità sembra essere utilizzato molto di rado e questo articolo si presuppone che tutto il @INC contiene solo le directory.

Andiamo su un esempio specifico, partendo dal presupposto che il vostro @INC contiene due sotto-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 pure. Per esempio. se esiste /usr/lib/perl/This/Here/MyModule2.pm, allora Perl non cercherà, né si preoccupano l'esistenza, di /opt/custom/lib/This/Here/MyModule2.pm.

NOTA: @INC viene utilizzato ogni volta interprete Perl utilizza meccanismo require simile per importare moduli Perl. Questo comprende:

  • direttiva require stessa
  • dichiarazione use MyModule (equivalente a richiedere + import)
  • use base (equivalente a richiedere + "push @ISA")
  • parametro di riga di comando -M

Altri suggerimenti

Anche se questo non risponde direttamente alla domanda, qui ci sono alcune semplici tecniche per determinare il percorso completo del file del modulo che si desidera utilizzare.

Per visualizzare il contenuto di default della @INC matrice, insieme con un sacco di altre informazioni, dalla riga di comando:

perl -V      

Se vuoi conoscere la posizione del Carp modulo:

perldoc -l Carp

All'interno di uno script, stampare il contenuto della % INC hash è utile per determinare il modulo attuale si sta utilizzando, in particolare se sono stati modificati @INC da suo default:

use Carp;
print $INC{'Carp.pm'};

Questo semplice script può essere utilizzato anche per Find installati moduli Perl corrispondenti a un'espressione regolare e per individuare eventuali moduli duplicati in diverse directory.

Secondo il perlfunc documentazione su use :

  

use Modulo LISTA

     

Importa alcune semantiche nel package corrente dal modulo di nome, generale creando un alias certo subroutine o nomi di variabili nel pacchetto. E 'esattamente equivalente a

BEGIN { require Module; Module->import( LIST ); }
     

eccetto che il modulo deve essere un bareword.

Quindi require fa il sollevamento di carichi pesanti, e il require documentazione fornisce

  

Se ESPR è un bareword, la richiedono assume un'estensione ".pm" e sostituisce "::" con "/" nel nome del file per voi, per rendere più facile il caricamento dei moduli standard. Questa forma di caricamento dei moduli non rischia di alterare lo spazio dei nomi.

     

In altre parole, se si tenta questo:

   require Foo::Bar;    # a splendid bareword
     

La funzione richiede effettivamente cercare il file "Foo/Bar.pm" nelle directory specificate nella matrice @INC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top