2016-08-08 3 views
4

mein Problem alsFügen Sie Perl-Modul von einem anderen Standort

  1. ich die lib in Lage folgt, ist haben ./abc/def/lib
  2. ich bin mit in Pfad ./abc/xyz/lib /tuv/abc.pm

ich den Code aus einem anderen Ort ganz die läuft, ist so etwas wie ./abc/xyz/blah1/blah2/../../. Ich führe den Code hier.

Ich habe erstellt env params

setenv def ./abc/def 
setenv xyz ./abc/xyz 

habe ich versucht, die unten Lösungen

  1. Begin { push(@INC, $ENV{def}."/lib") }
    Zusammen mit der den Weg für andere Bibliotheken Bereitstellung verwendet i use lib $ ENV {xyz} . "/ lib"

    Diese Lösung hat nicht funktioniert. Ich bekomme den Fehler, dass die Bibliothek in ./abc/def/lib nicht enthalten ist.

  2. ich die FindBin versucht

    # for the libs present in ./abc/def/lib 
    use FindBin; 
    use lib "$FindBin::Bin/../../"; 
    use mylib::abc; 
    use mylib::def; 
    

(Ich habe versucht, den Weg geben auch der Wurzel aus dem looking..in FindBin starten)

habe ich versucht, verschiedene Kombinationen verwenden, aber nicht sicher, warum es nicht funktioniert. Kann jemand darauf hinweisen, was ich falsch mache oder ist mein Verständnis von FindBin falsch.

Antwort

0

Das FindBin Modul ist das beste für Ihre Bedürfnisse. Wichtig ist, dass sich $FindBin::Bin auf das Verzeichnis bezieht, das das Skript enthält. Also, wenn Sie sich darauf beziehen ...

use lib $FindBin::Bin . '/../../etc'; 

der ‚/../ ..‘ Pfad muss den Pfad aus dem Skript-Verzeichnis in dem Verzeichnis lib beschreiben.

Die andere wichtige zu berücksichtigende Sache ist die Fehlermeldung. Es wird mit Can't locate Your/Module/Name.pm beginnen, aber wird dann fortfahren, alle Verzeichnisse in @INC aufzulisten - der Bibliothekssuchpfad. Überprüfen Sie diese Liste von Verzeichnissen, um sicherzustellen, dass sie den lib-Pfad enthält, den Sie hinzufügen wollten.

+0

Vielen Dank @Grant McLean für die Erklärung. Es hat mein Verständnis von FindBin jetzt geklärt. Ihre Antwort war hilfreich. –

3

Sie sagen nicht, welche Probleme Sie haben. Nur zu sagen, du bist "nicht sicher, warum es nicht funktioniert" ist nicht wirklich hilfreich. Ich nehme an, Sie bekommen einen "Kann nicht [etwas Modul] in @INC" Fehler finden.

Es gibt drei (empfohlene) Möglichkeiten, den Wert @INC zu ändern. Jeder hat seine Verwendung.

  • Innerhalb eines Programms können Sie use lib
  • in der Befehlszeile (oder in einem shebang) verwenden zu können, -I
  • In der Shell-Umgebung verwenden können, können Sie PERL5LIB

gesetzt In all diesen Fällen werden die neuen Verzeichnisse zum Anfang von @INC hinzugefügt, so dass diese Verzeichnisse vor den Standardbibliotheksverzeichnissen durchsucht werden.

Sie können auch manuell @INC manipulieren. Beachten Sie, dass die manuelle Bearbeitung von @INC Auswirkungen auf use Anweisungen in Ihrem Code haben muss, müssen sie in einem BEGIN Block ausgeführt werden (wie use Anweisungen zur Kompilierzeit ausgeführt werden). Es sieht so aus, als ob du das auch ausprobiert hast, aber dass du Begin statt BEGIN benutzt hast - was nicht funktionieren würde.

Wenn Sie Ihr Programm von einem Speicherort ausführen, der nicht mit den Verzeichnissen in Verbindung steht, in denen die Bibliotheken gespeichert sind, ist FindBin wahrscheinlich nur von begrenztem Nutzen. FindBin ist nützlich, wenn der Speicherort der ausführbaren Datei und der Bibliotheken eng verwandt sind (z. B. die ausführbare Datei befindet sich in ./bin und die Bibliotheken befinden sich in ./lib).

Es scheint auch, dass Sie versuchen, @INC aus einer Bibliothek (./abc/xyz/lib/tuv/abc.pm) anpassen. Beachten Sie, dass FindBin $FindBin::Bin in diesem Verzeichnis nicht festlegen wird. $FindBin::Bin ist immer auf das Verzeichnis festgelegt, das die ausführbare Datei enthält, die ausgeführt wird.

Ohne mehr über die tatsächlichen Pfade zu wissen, die Sie verwenden (Sie haben nur relative Pfade in Ihren Beispielen angegeben), ist es schwer zu wissen, was der beste Ansatz ist. Aber ich denke, in Ihrer Situation würde ich PERL5LIB auf den absoluten Pfad Ihrer zusätzlichen Bibliotheken setzen.

+0

Sorry @Dave Cross. Ich habe vergessen, den Fehler zu erwähnen. Ja, ich habe den Fehler, den du erwähnt hast. Vielen Dank für Ihre ausführliche Erklärung. Dies gab mir ein besseres Verständnis darüber, wann ich FindBin verwenden sollte und auch eine bessere Perspektive. Vielen Dank für Ihre Zeit. –

Verwandte Themen