Jakie są wszystkie sposoby wpływania na to, gdzie moduły Perla są wyszukiwane? lub, jak zbudowana jest @INC Perla ?
Jak wiemy, Perl używa @INC
tablicy zawierającej nazwy katalogów, aby określić, gdzie szukać plików modułu Perla .
Wydaje się, że nie ma obszernego postu typu „@INC” FAQ na StackOverflow, więc to pytanie jest zamierzone jako jedno.
perl
perl-module
DVK
źródło
źródło
@INC
w czasie wykonywania, a nie pełną konstrukcję.Odpowiedzi:
Przyjrzymy się, jak konstruowana jest zawartość tej tablicy i można nią manipulować, aby wpłynąć na to, gdzie interpreter Perla znajdzie pliki modułów.
Domyślna
@INC
Interpreter języka Perl jest kompilowany z określoną
@INC
wartością domyślną . Aby znaleźć tę wartość, uruchomenv -i perl -V
polecenie (env -i
ignorujePERL5LIB
zmienną środowiskową - patrz # 2), a na wyjściu zobaczysz coś takiego:Uwaga
.
na końcu; jest to katalog bieżący (niekoniecznie taki sam jak katalog skryptu). Brakuje go w Perlu 5.26+, a gdy Perl działa z-T
(włączone testy skażenia) .Aby zmienić domyślną ścieżkę podczas konfigurowania kompilacji binarnej Perla, ustaw opcję konfiguracji
otherlibdirs
:Zmienna środowiskowa
PERL5LIB
(lubPERLLIB
)Perl uprzednio oczekuje
@INC
na listę katalogów (oddzielonych dwukropkami) zawartych wPERL5LIB
(jeśli nie jest zdefiniowana,PERLLIB
używana) zmiennej środowiskowej powłoki. Aby zobaczyć zawartość zmiennych@INC
poPERL5LIB
iPERLLIB
zmiennych środowiskowych, zadziałają, uruchomperl -V
.-I
opcja wiersza poleceńPerl wstępnie oczekuje
@INC
na listę katalogów (oddzielonych dwukropkami) przekazanych jako wartość-I
opcji wiersza poleceń. Można to zrobić na trzy sposoby, jak zwykle z opcjami Perla:Przekaż to w wierszu poleceń:
Przekaż go przez pierwszą linię (shebang) skryptu Perla:
Przekaż jako część
PERL5OPT
(lubPERLOPT
) zmiennej środowiskowej (patrz rozdział 19.02 w Programowaniu w Perlu )Przekaż to poprzez
lib
pragmęPerl uprzednio oczekuje na przesłanie
@INC
do niego listy katalogówuse lib
.W programie:
W wierszu poleceń:
Możesz także usunąć katalogi z
@INC
poprzezno lib
.Możesz bezpośrednio manipulować
@INC
jako zwykłą tablicę Perla.Uwaga: Ponieważ
@INC
jest używany podczas fazy kompilacji, należy to zrobić wewnątrzBEGIN {}
bloku, który poprzedzause MyModule
instrukcję.Dodaj katalogi na początek za pośrednictwem
unshift @INC, $dir
.Dodaj katalogi do końca za pośrednictwem
push @INC, $dir
.Rób wszystko, co możesz zrobić z tablicą Perla.
Uwaga: katalogi są bez shiftu wychodzą
@INC
w kolejności podanej w tej odpowiedzi, np domyślnym@INC
jest ostatni na liście, poprzedzonyPERL5LIB
poprzedzone-I
, poprzedzonyuse lib
oraz bezpośrednia@INC
manipulacja, to ostatnie dwa mieszane w zależności od tego kolejności są w kodzie Perl.Bibliografia:
@INC
?Wydaje się, że nie ma obszernego
@INC
postu typu FAQ na temat przepełnienia stosu, więc to pytanie jest zamierzone jako jedno.Kiedy stosować każde podejście?
Jeśli moduły w katalogu muszą być używane przez wiele / wszystkie skrypty w Twojej witrynie, zwłaszcza uruchamiane przez wielu użytkowników, katalog ten powinien zostać zawarty w domyślnej
@INC
kompilacji do pliku binarnego Perla.Jeśli moduły w katalogu będą używane wyłącznie przez określonego użytkownika do wszystkich skryptów uruchamianych przez użytkownika (lub jeśli rekompilacja Perla nie jest opcją zmiany domyślnej
@INC
w poprzednim przypadku użycia), ustaw 'użytkowników'PERL5LIB
, zwykle podczas logowania użytkownika.Uwaga: Należy pamiętać o zwykłych pułapkach zmiennych środowiskowych systemu Unix - np. W niektórych przypadkach uruchamianie skryptów, ponieważ dany użytkownik nie gwarantuje uruchomienia ich ze skonfigurowanym środowiskiem tego użytkownika, np
su
. Przez .Jeśli moduły w katalogu muszą być używane tylko w określonych okolicznościach (np. Gdy skrypt (y) jest wykonywany w trybie programowania / debugowania, możesz ustawić
PERL5LIB
ręcznie lub przekazać-I
opcję perl.Jeśli moduły muszą być używane tylko do określonych skryptów, wszyscy użytkownicy ich używają, używają
use lib
/no lib
pragma w samym programie. Należy go również używać, gdy katalog, który ma być przeszukiwany, musi być dynamicznie określany w czasie wykonywania - np. Na podstawie parametrów wiersza poleceń skryptu lub ścieżki skryptu ( bardzo ładny przypadek użycia znajduje się w module FindBin ).Jeśli katalogami
@INC
należy manipulować zgodnie z jakąś skomplikowaną logiką, albo niemożliwą, albo zbyt niewygodną do wdrożenia za pomocą kombinacjiuse lib
/no lib
pragm, należy użyć bezpośredniej@INC
manipulacji wewnątrzBEGIN {}
bloku lub w bibliotece specjalnego przeznaczenia przeznaczonej do@INC
manipulacji, której musi użyć skrypt (s) przed użyciem jakichkolwiek innych modułów.Przykładem tego jest automatyczne przełączanie między bibliotekami w katalogach prod / uat / dev, z pobieraniem bibliotek kaskadowych w prod, jeśli brakuje go w dev i / lub UAT (ostatni warunek sprawia, że standardowe rozwiązanie „use lib + FindBin” jest dość skomplikowane. szczegółowych ilustracji tego scenariusza jest w jaki sposób korzystać z modułów Perla beta beta skryptów Perl? .
Dodatkowym przypadkiem użycia do bezpośredniego manipulowania
@INC
jest możliwość dodania odwołań do podprogramów lub odwołań do obiektów (tak, Virginia,@INC
może zawierać niestandardowy kod Perla, a nie tylko nazwy katalogów, jak wyjaśniono w rozdziale Kiedy wywoływane jest odwołanie do podprogramu w @INC? ).źródło
Oprócz wymienionych powyżej lokalizacji, wersja Perla dla OS X ma również dwa inne sposoby:
Plik /Library/Perl/x.xx/AppendToPath. Ścieżki wymienione w tym pliku są dołączane do @INC w czasie wykonywania.
Plik /Library/Perl/x.xx/PrependToPath. Ścieżki wymienione w tym pliku są dodawane do @INC w czasie wykonywania.
źródło
Jak już powiedziano, @INC jest tablicą i możesz dowolnie dodawać.
Mój skrypt REST CGI wygląda następująco:
Brak podprogramu jest eksportowany przez Rest.pm.
źródło