Что такое @INC ?
@INC - это специальная переменная Perl. Содержит список имен каталогов, в которых следует искать библиотечные файлы Perl. Этот список используется при подключении модулей с помощью do, use и require.
Первоначально @INC содержит:
- Список имен каталогов, которые были переданы интерпретатору с помощью ключа
-I. - Список имен каталогов, используемых perl по умолчанию. Содержимое этого списка зависит от платформы, на которой установлен perl.
- Символическое обозначение текущего каталога - символ точки "."
|
1 2 3 4 5 |
#!/usr/local/bin/perl foreach (@INC) { print $_."\n"; } |
Вывод:
|
1 2 3 4 5 6 7 8 |
%perl temp.pl /usr/local/lib/perl5/5.10.1/BSDPAN /usr/local/lib/perl5/site_perl/5.10.1/mach /usr/local/lib/perl5/site_perl/5.10.1 /usr/local/lib/perl5/5.10.1/mach /usr/local/lib/perl5/5.10.1 . |
Использование модуля lib для работы с @INC
lib - это модуль прагмы, которая упрощает работу с @INC . Используется для добавления в @INC новых каталогов на этапе компиляции perl-программы.
Добавление каталогов на этапе компиляции позволяет сделать их доступными в максимально ранний срок, до того как начнутся попытки поиска и подключения модулей.
Запись:
|
1 |
use lib qw( /usr/natalie/modules /usr/natalie/www/cgi ); |
практически идентична записи:
|
1 2 3 |
BEGIN { unshift(@INC, '/usr/natalie/modules', '/usr/natalie/www/cgi'); } |
Запись
|
1 |
no lib qw( /usr/natalie/modules /usr/natalie/www/cgi ); |
удаляет указанные каталоги из @INC.
Если подключение каких-либо каталогов с помощью use lib производится в большинстве используемых perl-программ, имеет смысл указать эти каталоги в переменной PERL5LIB.
Переменная окружения PERL5LIB
PERL5LIB - это переменная окружения, которая содержит список каталогов. Perl будет просматривать перечисленные каталоги на предмет обнаружения нужного модуля до того, как обратится к стандартному каталогу библиотек и текущему каталогу.
Список каталогов в PERL5LIB разделяется с помощью символа двоеточия.
Пример:
|
1 2 |
httpd.conf: PerlSetEnv PERL5LIB /usr/admin/lib:/usr/admin/perllib |
Что такое %INC ?
%INC - это специальная переменная Perl. %INC содержит одну пару "ключ-значение" для каждого файла, который подключили с помощью функций do, use или require. Ключ - это имя файла. Значение - полный путь к этому файлу.
|
1 2 3 4 5 6 7 |
#!/usr/local/bin/perl require Pack; foreach (keys %INC) { print $_." => ".$INC{$_}."\n"; } |
|
1 2 3 4 |
%perl temp.pl Pack.pm => Pack.pm Exporter.pm => /usr/local/lib/perl5/5.10.1/Exporter.pm |
Нужно учитывать, что подключаемые вами модули могут и сами подключать какие-то дополнительные библиотеки. В этом случае, содержимое %INC может оказаться несколько больших размеров, чем вы ожидали:
|
1 2 3 4 5 6 7 |
#!/usr/local/bin/perl use CGI; foreach (keys %INC) { print $_." => ".$INC{$_}."\n"; } |
Вывод:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
%perl temp.pl warnings/register.pm => /usr/local/lib/perl5/5.10.1/warnings/register.pm Carp.pm => /usr/local/lib/perl5/5.10.1/Carp.pm vars.pm => /usr/local/lib/perl5/5.10.1/vars.pm strict.pm => /usr/local/lib/perl5/5.10.1/strict.pm Exporter.pm => /usr/local/lib/perl5/5.10.1/Exporter.pm constant.pm => /usr/local/lib/perl5/5.10.1/constant.pm warnings.pm => /usr/local/lib/perl5/5.10.1/warnings.pm CGI/Util.pm => /usr/local/lib/perl5/5.10.1/CGI/Util.pm overload.pm => /usr/local/lib/perl5/5.10.1/overload.pm CGI.pm => /usr/local/lib/perl5/5.10.1/CGI.pm |
Таким образом, можно сказать, что %INC содержит полный список всех подключаемых текущей perl-программой файлов.
отличная статья, помогла