2012-12-19 8 views
12

Vorrei utilizzare la variabile $ var nel percorso lib.Come si usa una variabile in lib Path?

my $var = "/home/usr/bibfile;"

use lib "$var/lib/";

Tuttavia quando faccio questo getta un errore.

Mi piacerebbe utilizzare use lib "$var/lib/"; anziché use lib "/home/usr/bibfile/lib/";.

Come posso assegnare una variabile, in modo che possa essere utilizzata nell'impostazione dei moduli lib?

+0

avete qualche libreria in una directory non standard e si desidera utilizzarlo? – xhudik

+0

Sì. la libreria è in dir non standard. – Sourcecode

risposta

20

In primo luogo, si è verificato un semplice errore di sintassi: manca la ; dopo la prima riga. La variabile my dovrebbe altrimenti funzionare correttamente in use lib.

Tuttavia, dal momento che tutti use direttive sono eseguite in BEGIN blocco, la variabile verrà inizializzata al momento si esegue use, quindi è necessario mettere l'inizializzazione in BEGIN blocco troppo.

my $var; 
BEGIN { $var = "/home/usr/bibfile"; } 
use lib "$var/lib/"; 

use Data::Dumper; 
print Dumper \@INC; 

Dà:

$VAR1 = [ 
     '/home/usr/bibfile/lib/', 
     # ... more ... 
    ]; 
+0

@ikegami, lib controlla anche e aggiunge la versione standard e le sottodirectory di arco della destinazione, se trovate. –

1

Non sei sicuro di quello che stai cercando di realizzare, ma sembra come un compito per FindBin::libs:

my $var; 
BEGIN { $var = "/home/usr/bibfile" }; 
use FindBin::libs "Bin=$var", "base=lib"; 
+0

Mi piacerebbe usare 'use lib" $ var/lib/";' insted di 'use lib"/home/usr/bibfile/lib/";'. Come posso assegnare una variabile, in modo che possa essere usata nell'impostazione dei moduli lib. – Sourcecode

+0

OK, modifica la risposta in base alle tue esigenze specifiche :) Tuttavia, ti suggerisco di evitare l'uso di percorsi assoluti codificati e di usarne uno relativo allo script corrente (ovvero lo scopo di FindBin :: libs) – creaktive

+1

@creaktive La tua risposta ora soffre dello stesso errore con cui l'interrogante ha incontrato all'inizio. È possibile risolvere questo problema utilizzando la soluzione nella risposta accettata. – MattLBeck

-3

Non è possibile, perché il use la direttiva viene valutata al momento della compilazione, mentre altre variabili vengono valutate in fase di runtime.

Se il lib si trova da qualche parte relativa allo script originale, è possibile utilizzare il modulo standard FindBin:

# $Bin from FindBin is the directory of the original script 
use FindBin; 
use lib "$FindBin::Bin/path/to/bib"; 
use MyModule;