Каковы все способы влиять, где модули Perl разыскиваются? или, Как @INC Perl создается?
Поскольку мы знаем, использование Perl @INC
массив, содержащий имена каталогов для определения, где искать файлы модуля Perl.
На StackOverflow, кажется, нет всестороннего "@INC" сообщения типа FAQ, таким образом, этот вопрос предназначается как один.
Мы рассмотрим, как создается содержимое этого массива и как с ним можно работать, чтобы повлиять на то, где интерпретатор Perl найдет файлы модулей.
По умолчанию @INC
Интерпретатор Perl скомпилирован с определенным @INC
значением по умолчанию . Чтобы узнать это значение, запустите команду env -i perl -V
( env -i
игнорирует переменную среды PERL5LIB
- см. № 2) и в выводе вы увидите что-то вроде этого:
$ env -i perl -V ... @ INC: /usr/lib/perl5/site_perl/5.18.0 / x86_64-linux-thread-multi-ld /usr/lib/perl5/site_perl/5.18.0 /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi -ld /usr/lib/perl5/5.18.0 .
Примечание .
в конце; это текущий каталог (который не обязательно совпадает с каталогом сценария). Он отсутствует в Perl 5.26+, и когда Perl работает с -T
(включена проверка заражения) .
Чтобы изменить путь по умолчанию при настройке двоичной компиляции Perl, установите параметр конфигурации otherlibdirs
:
Настроить -Dotherlibdirs = / usr / lib / perl5 / site_perl / 5.16.3
Переменная среды PERL5LIB
(или PERLLIB
)
Perl-препенды @INC
со списком каталогов (разделенных двоеточиями), содержащихся в PERL5LIB
(если он не определен, используется PERLLIB
) переменная среды вашей оболочки. Чтобы увидеть содержимое @INC
после того, как переменные среды PERL5LIB
и PERLLIB
вступили в силу, запустите perl -V
.
$ perl -V ... % ENV: PERL5LIB = "/ home / myuser / test" @ INC: {{1} } / home / myuser / test /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld /usr/lib/perl5/site_perl/5.18. 0 /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld /usr/lib/perl5/5.18.0 . {{1 }}
-I
параметр командной строки
Perl предварительно ожидает @INC
со списком каталогов (разделенных двоеточиями), переданным как значение -I
параметр командной строки. Это можно сделать тремя способами, как обычно с параметрами Perl:
Передайте его в командной строке:
perl -I / my / moduledir your_script.pl
Передайте его через первую строку (shebang) вашего Perl-скрипта:
#! / usr / local / bin / perl -w -I / my / moduledir
Передайте его как часть PERL5OPT
( или PERLOPT
) переменной среды (см. главу 19.02 в Программирование Perl )
Передайте ее через прагму lib
Perl pre-pends @INC
со списком каталогов, переданных ему через , используйте lib
.
В программе:
использовать lib ("/ dir1", "/ dir2");
В командной строке:
perl -Mlib = / dir1, / dir2 { {1}}
Вы также можете удалить каталоги из @INC
через no lib
.
Вы можете напрямую управлять @INC
как обычным массивом Perl.
Примечание. Поскольку @INC
используется на этапе компиляции, это необходимо делать внутри блока BEGIN {}
, который предшествует use MyModule
утверждение.
Добавьте каталоги в начало с помощью unshift @INC, $ dir
.
Добавьте каталоги в конец с помощью push @INC, $ dir
.
Делайте все, что вы можете делать с массивами Perl.
Примечание. Каталоги несмещены на @INC
в порядке, указанном в этом ответе, например по умолчанию @INC
стоит последним в списке, ему предшествует PERL5LIB
, которому предшествует -I
, которому предшествует использовать lib
и прямой ] @INC
, последние два смешиваются в любом порядке в коде Perl.
@INC
? Нет кажутся исчерпывающими @INC
часто задаваемыми вопросами о переполнении стека, так что этот вопрос задуман как один.
Если модули в каталоге должны использоваться многими / всеми скриптами на вашем сайте, особенно запускаемыми несколькими пользователями, этот каталог должен быть включен в @INC по умолчанию
скомпилирован в двоичный файл Perl.
Если модули в каталоге будут использоваться исключительно конкретным пользователем для всех сценариев, запускаемых пользователем (или если перекомпиляция Perl не является вариантом для изменения значения по умолчанию @INC
в предыдущем варианте использования), установите PERL5LIB
пользователей, обычно во время входа в систему.
Примечание: обратите внимание на обычные ошибки переменных среды Unix - например, в некоторых случаях запуск сценариев от имени конкретного пользователя не гарантирует их запуск с настроенной средой этого пользователя, например через su
.
Если модули в каталоге необходимо использовать только в определенных обстоятельствах (например, когда скрипт (ы) выполняется в режиме разработки / отладки, вы можете либо установить PERL5LIB
вручную, либо передать -I
параметр для perl.
Если модули необходимо использовать только для определенных сценариев, все пользователи, использующие их, используют , используют lib
/ ] нет прагм lib
в самой программе. Его также следует использовать, когда каталог для поиска необходимо динамически определять во время выполнения - например, из параметров командной строки сценария или пути сценария (см. FindBin ] для очень приятного случая использования).
Если каталогами в @INC
нужно манипулировать в соответствии с какой-то сложной логикой, либо невозможно, либо слишком громоздко для реализации с помощью комбинации , используйте lib
/ no lib
, затем используйте прямую манипуляцию @INC
внутри блока BEGIN {}
или внутри специальной библиотеки, предназначенной для манипуляции @INC
, которая должна использоваться ваш скрипт (ы) до использования любых других модулей.
Примером этого является автоматическое переключение между библиотеками в каталогах prod / uat / dev, с подхватом библиотеки водопада в продукте, если она отсутствует в dev и / или UAT (последнее условие делает стандартное решение "use lib + FindBin" справедливым сложно. Подробная иллюстрация этого сценария находится в Как использовать бета-модули Perl из бета-скриптов Perl? .
Дополнительный вариант использования для прямого управления @INC
, чтобы иметь возможность добавлять ссылки на подпрограммы или ссылки на объекты (да, Вирджиния, @INC
может содержать собственный код Perl, а не только имена каталогов, как объяснено в Когда ссылка на подпрограмму в @ Звонил INC? ).