Welche Auswirkungen haben die Auswirkungen darauf, wo nach Perl-Modulen gesucht wird? oder Wie ist Perls @INC aufgebaut ?
Wie wir wissen, verwendet Perl ein @INC
Array mit Verzeichnisnamen, um zu bestimmen, wo nach Perl-Moduldateien gesucht werden soll .
Es scheint keinen umfassenden FAQ-Beitrag vom Typ "@INC" auf StackOverflow zu geben, daher ist diese Frage als eine Frage gedacht.
perl
perl-module
DVK
quelle
quelle
@INC
Laufzeit etwas hinzufügt , nicht die vollständige Konstruktion.Antworten:
Wir werden uns ansehen, wie der Inhalt dieses Arrays aufgebaut ist und manipuliert werden kann, um zu beeinflussen, wo der Perl-Interpreter die Moduldateien findet.
Standard
@INC
Perl-Interpreter wird mit einem bestimmten
@INC
Standardwert kompiliert . Um diesen Wert herauszufinden, führen Sie denenv -i perl -V
Befehl aus (env -i
ignoriert diePERL5LIB
Umgebungsvariable - siehe # 2) und in der Ausgabe sehen Sie ungefähr Folgendes:Beachten Sie
.
am Ende; Dies ist das aktuelle Verzeichnis (das nicht unbedingt mit dem Verzeichnis des Skripts identisch ist). Es fehlt in Perl 5.26+ und wenn Perl mit ausgeführt wird-T
(Taint Checks aktiviert) .Legen Sie die Konfigurationsoption fest, um den Standardpfad beim Konfigurieren der Perl-Binärkompilierung zu ändern
otherlibdirs
:Umgebungsvariable
PERL5LIB
(oderPERLLIB
)Perl wird
@INC
mit einer Liste von Verzeichnissen (durch Doppelpunkte getrennt) versehen, die in der Umgebungsvariablen Ihrer Shell enthalten sindPERL5LIB
(sofern diese nicht definiert ist,PERLLIB
wird sie verwendet). Führen Sie Folgendes aus, um anzuzeigen, dass der Inhalt von@INC
After-PERL5LIB
undPERLLIB
Umgebungsvariablen wirksam geworden istperl -V
.-I
BefehlszeilenoptionPerl wird
@INC
mit einer Liste von Verzeichnissen (durch Doppelpunkte getrennt) versehen, die als Wert der-I
Befehlszeilenoption übergeben werden. Dies kann wie bei Perl-Optionen üblich auf drei Arten erfolgen:Übergeben Sie es über die Befehlszeile:
Übergeben Sie es über die erste Zeile (shebang) Ihres Perl-Skripts:
Übergeben Sie es als Teil einer
PERL5OPT
(oderPERLOPT
) Umgebungsvariablen (siehe Kapitel 19.02 in Programming Perl ).Übergeben Sie es über das
lib
PragmaPerl stellt
@INC
eine Liste der Verzeichnisse voraus, die über perl übergeben wurdenuse lib
.In einem Programm:
In der Befehlszeile:
Sie können die Verzeichnisse auch aus
@INC
via entfernenno lib
.Sie können direkt
@INC
als reguläres Perl-Array bearbeiten.Hinweis: Da dies
@INC
während der Kompilierungsphase verwendet wird, muss dies innerhalb einesBEGIN {}
Blocks erfolgen, der deruse MyModule
Anweisung vorausgeht .Fügen Sie am Anfang Verzeichnisse über hinzu
unshift @INC, $dir
.Fügen Sie am Ende Verzeichnisse über hinzu
push @INC, $dir
.Machen Sie alles andere, was Sie mit einem Perl-Array tun können.
Hinweis: Die Verzeichnisse werden unverschoben auf
@INC
in der Reihenfolge , in dieser Antwort enthalten ist, zB Standard@INC
ist zuletzt in der Liste vorangestellt istPERL5LIB
, vorangestellt-I
, mit vorangestellteruse lib
und direkter@INC
Manipulation, wobei die beiden letzteren gemischt in beliebiger Reihenfolge sie sind in Perl - Code.Verweise:
@INC
?Es scheint keinen umfassenden
@INC
FAQ-Beitrag zum Stapelüberlauf zu geben, daher ist diese Frage als eine Frage gedacht.Wann sollte jeder Ansatz verwendet werden?
Wenn die Module in einem Verzeichnis von vielen / allen Skripten auf Ihrer Site verwendet werden müssen, insbesondere von mehreren Benutzern, sollte dieses Verzeichnis in der Standardeinstellung enthalten sein,
@INC
die in die Perl-Binärdatei kompiliert wurde.Wenn die Module im Verzeichnis ausschließlich von einem bestimmten Benutzer für alle vom Benutzer ausgeführten Skripts verwendet werden (oder wenn das Neukompilieren von Perl keine Option ist, um die Standardeinstellung
@INC
im vorherigen Anwendungsfall zu ändern ), legen Sie die ModulePERL5LIB
normalerweise während der Benutzeranmeldung fest.Hinweis: Bitte beachten Sie die üblichen Fallstricke bei Unix-Umgebungsvariablen. In bestimmten Fällen garantiert das Ausführen der Skripte als bestimmter Benutzer nicht, dass sie mit der eingerichteten Umgebung dieses Benutzers ausgeführt werden, z
su
. B. über .Wenn die Module im Verzeichnis nur unter bestimmten Umständen verwendet werden müssen (z. B. wenn die Skripte im Entwicklungs- / Debug-Modus ausgeführt werden), können Sie sie entweder
PERL5LIB
manuell festlegen oder die-I
Option an Perl übergeben.Wenn die Module nur für bestimmte Skripte von allen Benutzern verwendet werden müssen, verwenden Sie
use lib
/no lib
pragmas im Programm selbst. Es sollte auch verwendet werden, wenn das zu durchsuchende Verzeichnis zur Laufzeit dynamisch bestimmt werden muss - z. B. anhand der Befehlszeilenparameter oder des Skriptpfads des Skripts (ein sehr nützlicher Anwendungsfall finden Sie im FindBin- Modul).Wenn die Verzeichnisse
@INC
nach einer komplizierten Logik manipuliert werden müssen, die entweder nicht zu unhandlich ist, um durch Kombination vonuse lib
/no lib
pragmas implementiert zu werden , verwenden Sie die direkte@INC
Manipulation innerhalb desBEGIN {}
Blocks oder innerhalb einer für die@INC
Manipulation vorgesehenen Spezialbibliothek , die von Ihrem Skript verwendet werden muss (s) bevor andere Module verwendet werden.Ein Beispiel hierfür ist das automatische Wechseln zwischen Bibliotheken in den Verzeichnissen prod / uat / dev, wobei die Wasserfallbibliothek in prod aufgenommen wird, wenn sie in dev und / oder UAT fehlt (die letzte Bedingung macht die Standardlösung "use lib + FindBin" ziemlich kompliziert. A. detaillierte Darstellung dieses Szenarios ist in Wie verwende ich beta - Perl - Module von beta Perl - Skripte? .
Ein zusätzlicher Anwendungsfall für die direkte Bearbeitung
@INC
besteht darin, Unterprogrammreferenzen oder Objektreferenzen hinzufügen zu können (ja, Virginia@INC
kann benutzerdefinierten Perl-Code und nicht nur Verzeichnisnamen enthalten, wie unter Wann wird eine Unterprogrammreferenz in @INC aufgerufen? ) Erläutert .quelle
Zusätzlich zu den oben aufgeführten Speicherorten bietet die OS X-Version von Perl zwei weitere Möglichkeiten:
Die Datei /Library/Perl/x.xx/AppendToPath. In dieser Datei aufgeführte Pfade werden zur Laufzeit an @INC angehängt.
Die Datei /Library/Perl/x.xx/PrependToPath. Die in dieser Datei aufgeführten Pfade werden zur Laufzeit an @INC vorangestellt.
quelle
Wie bereits gesagt, ist @INC ein Array und Sie können alles hinzufügen, was Sie wollen.
Mein CGI REST-Skript sieht folgendermaßen aus:
Unterprogramm weg wird von Rest.pm exportiert.
quelle