Molto probabilmente il motivo per cui la tua spinta non ha funzionato è l'ordine di esecuzione.
use
è una direttiva di compilazione. È push
è fatto a tempo di esecuzione:
push (@INC,"directory_path/more_path");
use Foo.pm; # In directory path/more_path
È possibile utilizzare un blocco BEGIN per aggirare questo problema:
BEGIN {
push (@INC,"directory_path/more_path");
}
use Foo.pm; # In directory path/more_path
IMO, è chiaro, e quindi meglio use lib
:
use lib "directory_path/more_path";
use Foo.pm; # In directory path/more_path
Vedere perlmod per informazioni su BEGIN e altri blocchi speciali e quando vengono eseguiti.
Modifica
Per il codice di carico relativa allo script/biblioteca, sottoscrivo fortemente File::FindLib
Si può dire use File::FindLib 'my/test/libs';
per cercare una directory di libreria ovunque sopra lo script nel percorso.
Dite il vostro lavoro è strutturato in questo modo:
/home/me/projects/
|- shared/
| |- bin/
| `- lib/
`- ossum-thing/
`- scripts
|- bin/
`- lib/
all'interno di uno script in ossum-thing/scripts/bin
:
use File::FindLib 'lib/';
use File::FindLib 'shared/lib/';
troverete la vostra directory di libreria e aggiungerli al tuo @INC
.
È anche utile creare un modulo che contenga tutte le impostazioni dell'ambiente necessarie per eseguire la suite di strumenti e caricarlo in tutti gli eseguibili del progetto.
use File::FindLib 'lib/MyEnvironment.pm'
Dopo molti tentativi il codice che ha funzionato alla fine è stato dalla domanda che Andomar ha collegato a: utilizzare FindBin; # trova questo scriptuse lib "$ FindBin :: Bin/.."; # usa la directory principale usa EPMS; Grazie per tutto il vostro aiuto a tutti! –
Cheers, sembra che tutti leggano "directory corrente" dove hai scritto "directory del modulo". – Andomar
È venuto fuori dopo aver letto http://stackoverflow.com/a/90721/2668831 che afferma che il metodo FindBin non è affidabile per alcune forme di organizzazione Perl modulare (qualcun altro potrebbe essere in grado di chiarire) –