2012-12-19 6 views
12

Ich möchte die $ var-Variable in lib-Pfad verwenden.Wie verwenden Sie eine Variable in Lib Path?

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

use lib "$var/lib/";

Jedoch, wenn ich dies tun, wirft es einen Fehler.

Ich möchte use lib "$var/lib/"; statt use lib "/home/usr/bibfile/lib/"; verwenden.

Wie kann ich eine Variable zuweisen, so dass sie in der Einstellung von lib-Modulen verwendet werden kann?

+0

Sie haben eine Bibliothek in einem Nicht-Standard-Verzeichnis, und Sie wollen, es zu benutzen? – xhudik

+0

Ja. Die Bibliothek befindet sich in nicht standardmäßigen Verzeichnissen. – Sourcecode

Antwort

20

Zuerst haben Sie einen einfachen Syntaxfehler - Sie fehlen ; nach der ersten Zeile. my Variable sollte sonst in use lib gut funktionieren.

Da jedoch alle use Richtlinien in BEGIN Block ausgeführt werden, wird Ihre Variable zur Zeit Sie use laufen nicht initialisiert werden, so dass Sie auch die Initialisierung in BEGIN Block setzen müssen.

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

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

Gibt:

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

@ikegami, lib prüft und fügt auch Standardversion und Arch-Unterverzeichnisse des Ziels hinzu, falls sie gefunden werden. –

1

Nicht sicher, was Sie versuchen scheint zu erreichen, aber wie eine Aufgabe für FindBin::libs:

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

Ich möchte 'lib verwenden '$ var/lib /"; 'nicht verwenden' lib verwenden/home/usr/bibfile/lib/";'. Wie kann ich eine Variable zuweisen, so dass sie bei der Einstellung von lib-Modulen verwendet werden kann. – Sourcecode

+0

OK, habe die Antwort bearbeitet, um sie an deine spezifischen Bedürfnisse anzupassen :) Ich würde dir jedoch empfehlen, keine hardcodierten absoluten Pfade zu verwenden und diese im Verhältnis zu deinem aktuellen Skript zu verwenden (das ist der Zweck von FindBin :: libs) – creaktive

+1

@kretive Deine Antwort leidet nun unter dem gleichen Fehler, mit dem der Fragesteller anfing. Sie können dies mithilfe der Lösung in der akzeptierten Antwort beheben. – MattLBeck

-3

Sie können nicht, weil der use Direktive wird zur Kompilierzeit ausgewertet, während andere Variablen zur Laufzeit ausgewertet werden.

Wenn Ihr lib zu Ihrem ursprünglichen Skript irgendwo relativ befindet, können Sie den Standard-Modul verwenden FindBin:

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