2013-02-13 28 views
5

Se si dispone di un file .pm, esiste un modo per farlo, use, senza posizionarlo sul percorso @INC? Penso che sarebbe più chiaro nel mio caso d'uso particolare: più chiaro dell'utilizzo di percorsi relativi o aggiunta di questa directory a @INC.Perl usa/richiede il percorso di abolizione?

Edit: Precisazione:.

speravo di evitare la necessità di scorrere ogni elemento in @INC, e invece specificare direttamente quale file Sono interessato a Ad esempio, nel Node.JS, require('something') sarà cerca l'elenco dei percorsi, ma require('/specific/something') andrà direttamente dove lo dico.

In Perl, non sono sicuro che questa sia la stessa funzionalità trovata in require, ma sembra funzionare.

Tuttavia, le istruzioni use richiedono una password. Questo mi ha lasciato un po 'perplesso su come entrare in un percorso assoluto.

+0

'use lib' istruzione prima che' use module' sia corretto per il tuo caso. Ma perché non puoi usare 'require'. È più adatto al tuo problema. Inoltre è possibile impostare la variabile di ambiente 'SetEnv PERL5LIB' in apache conf per applicare tale directory per l'intero progetto o applicazione. –

+0

Ho bisogno di richiedere un file '.pm'. Non ho provato, ma non sembra che funzioni correttamente. Solitamente chiamo funzioni nel modulo con sintassi come 'CGI :: ReadParse();' oppure 'uso CGI': cgi '; '. Non so come potrei farlo con 'require' per un file' .pm', ma se potessi farlo con 'require', risolverebbe davvero il mio problema. –

+0

Funziona. Prova in questo modo 'require" Newmodule.pm ";" e quindi chiama 'Newmodule :: subname();'. Funziona bene. –

risposta

4

Come per la discussione nei commenti, vi suggerirei di usare require stessa. Come qui di seguito,

require "pathto/module/Newmodule.pm"; 

Newmodule::firstSub(); 

Inoltre è possibile utilizzare altre opzioni come sotto

  • use lib 'pathto/module'; Questa linea deve essere aggiunto a tutti i file che si desidera utilizzare il modulo.

usa lib 'pathto/module';
utilizzare Newmodule;

  • utilizzando PERL5LIB variabile d'ambiente.Impostalo sulla riga di comando utilizzando l'esportazione o aggiungilo a ~/.bashrc in modo che con ogni accesso venga aggiunto al tuo @INC. Ricorda che PERL5LIB aggiunge la directory prima di tutte le directory @INC. Quindi sarà usato prima. Inoltre è possibile impostare in httpd.conf apache usando

    SetEnv PERL5LIB /fullpath/to/module 
    
  • o impostarlo in blocco BEGIN.

4

È possibile utilizzare questo:

use lib '/path/to/Perl_module_dir'; # can be both relative or absolute 
use my_own_lib; 

È possibile modificare @INC da soli (temporaneamente, nessuna paura, questo è ciò che use lib non troppo):

BEGIN{ @INC = ('/path/to/Perl_module_dir', @INC); } # relative or absolute too 
use my_own_lib; 
+0

Quest'ultimo è molto simile a ciò che usa lib', eccetto che usa 'unshift' invece di' pop' per assicurarsi che i propri moduli vengano prelevati prima di qualsiasi altra cosa con lo stesso nome. – Borodin

+0

POST modificato di conseguenza per premere all'inizio dell'array. –

+2

mettere un modulo nella stessa directory del tuo programma funziona bene solo se questa è la tua directory di lavoro. '. ! = dirname 'di default ... – pavel

0

È possibile utilizzare il modulo Module::Load

use Module::Load; 
load 'path/to/module.pm'; 
+0

Non ci sono indicazioni che voglia caricare il modulo in fase di runtime, quindi dovresti avvolgere il modulo in un' BEGIN'. Inoltre non fornisce un mezzo per importare simboli, quindi dovresti aggiungere anche una chiamata a "import" nel blocco BEGIN. Complessivamente una soluzione scadente per ciò che l'OP vuole fare. – ikegami

0

FindBin::libs fa il trucco:

# search up $FindBin::Bin looking for ./lib directories 
# and "use lib" them. 

use FindBin::libs; 
+0

Utilizza FindBin :: libs utilizza $ FindBin: Bin invece di $ FindBin: RealBin, quindi non funziona quando si utilizza un collegamento simbolico allo script :( – ikegami

1

In generale, impostare l'ambiente PERL5LIB var.

export PERL5LIB=/home/ikegami/perl/lib 

Se il modulo di trovare è destinato ad essere installato in una directory relativa allo script, utilizzare il seguente:

use FindBin qw($RealBin); 
use lib $RealBin; 
    # or 
use lib "$RealBin/lib"; 
    # or 
use lib "$RealBin/../lib"; 

Ciò gestire correttamente i collegamenti simbolici allo script.

$ mkdir t 

$ cat >t/a.pl 
use FindBin qw($RealBin); 
use lib $RealBin; 
use Module; 

$ cat >t/Module.pm 
package Module; 
print "Module loaded\n"; 
1; 

$ ln -s t/a.pl 

$ perl a.pl 
Module loaded