Как @INC Perl создается? (иначе, Каковы все способы влиять, где модули Perl разыскиваются?)

Каковы все способы влиять, где модули Perl разыскиваются? или, Как @INC Perl создается?

Поскольку мы знаем, использование Perl @INC массив, содержащий имена каталогов для определения, где искать файлы модуля Perl.

На StackOverflow, кажется, нет всестороннего "@INC" сообщения типа FAQ, таким образом, этот вопрос предназначается как один.

198
задан Community 23 May 2017 в 00:31
поделиться

1 ответ

Мы рассмотрим, как создается содержимое этого массива и как с ним можно работать, чтобы повлиять на то, где интерпретатор Perl найдет файлы модулей.

  1. По умолчанию @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

  1. Переменная среды 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 }} 
  2. -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 )

  3. Передайте ее через прагму lib

    Perl pre-pends @INC со списком каталогов, переданных ему через , используйте lib .

    В программе:

     использовать lib ("/ dir1", "/ dir2"); 
     

    В командной строке:

     perl -Mlib = / dir1, / dir2 { {1}} 

    Вы также можете удалить каталоги из @INC через no lib .

  4. Вы можете напрямую управлять @INC как обычным массивом Perl.

    Примечание. Поскольку @INC используется на этапе компиляции, это необходимо делать внутри блока BEGIN {} , который предшествует use MyModule утверждение.

    • Добавьте каталоги в начало с помощью unshift @INC, $ dir .

    • Добавьте каталоги в конец с помощью push @INC, $ dir .

    • Делайте все, что вы можете делать с массивами Perl.

Примечание. Каталоги несмещены на @INC в порядке, указанном в этом ответе, например по умолчанию @INC стоит последним в списке, ему предшествует PERL5LIB , которому предшествует -I , которому предшествует использовать lib и прямой ] @INC , последние два смешиваются в любом порядке в коде Perl.

Ссылки:

Нет кажутся исчерпывающими @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? ).

254
ответ дан 23 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: