2010-04-07 18 views
5

Io uso use lib "./DIR" per afferrare una libreria da una cartella altrove. Tuttavia, non sembra funzionare sul mio server, ma funziona bene sul mio desktop locale. Alcuni motivi particolari?Come funziona il lib pragma di Perl?

E un'altra domanda, non use lib ottenere propagato all'interno di diversi moduli?

Due situazioni: Suppongo di creare una classe base che richiede alcune librerie, ma so che è necessario estenderla e la classe estesa dovrà utilizzare un'altra libreria. Posso inserire il comando use lib nella classe base? o dovrò metterlo in ogni classe che si estende?

Infine, posso avere solo un use package dove il pacchetto contiene un po 'di lib di uso, propagherà le istruzioni lib di uso al mio modulo corrente? < - Non penso, ma chiedendo comunque

risposta

3

Il . nell'istruzione use lib significa "directory di lavoro corrente" e funzionerà solo quando lo script viene eseguito dalla directory corretta. L'idea del server di cwd è probabilmente qualcosa di diverso (o indefinito). Supponendo che la directory della libreria è co-location con con sceneggiatura e privato ad esso si vuole fare qualcosa di simile a questo, invece:

use FindBin; 
use lib "$FindBin::Bin/DIR"; 

Una dichiarazione use lib colpisce @INC - l'elenco delle località perl ricerche quando si use o require un modulo. Influisce globalmente sull'istanza corrente dell'interprete. Si dovrebbe davvero mettere solo use lib dichiarazioni negli script, non in moduli.

In linea di principio, si potrebbe avere un package MyLibs che consisteva di un gruppo di use lib dichiarazioni e poi use MyLibs prima di utilizzare uno qualsiasi dei pacchetti in quelle posizioni, ma io non lo consiglio.

+0

ho usato getcwd di capire dove "" è. Sei curioso di sapere se è possibile capire dove si trova lo script perl? Non ha funzionato quando ho provato a usare FindBin perché lib e bin non sono co-locati. Quindi ecco un esempio di ciò che sto cercando di fare. Eseguo lo script perl da say folder1. Ha use lib "/ abs/path/topack /"; usare il pacchetto. Nel pacchetto uso lib './FOLDER2'; supponendo che il cwd sarebbe lo stesso. Da "." punta a Cartella1 e non al percorso. È sbagliato. Come faccio a non utilizzare il percorso assoluto nel pacchetto, ma posso anche usarlo? È possibile? – Tyug

+0

@Tug: è possibile determinare da dove è stato caricato un modulo controllando '% INC'. Vedi http://stackoverflow.com/questions/1463414 per una domanda simile che dovrebbe farti puntare nella giusta direzione. –

+0

Grazie mille! – Tyug

2

Non c'è modo di sapere perché non funziona sul server senza ulteriori informazioni. In particolare, controllare i log di errore del server, e dump @INC da qualche parte, se necessario, e che, per confrontare i percorsi di libreria effettivi.

use lib modifica @INC, che è globale, così finché si esegue il tuo use lib prima di altri pacchetti cercano di includere cose, funzionerà e tutti gli altri pacchetti vedrà la nuova percorsi di inclusione.

Per ulteriori informazioni su @INC, vedere la relativa voce in perlvar.

Problemi correlati