Perl использует / требует абсолютного пути?

Если у меня есть .pm файл, могу ли я его use, не помещая его на свой @INC путь? Я думаю, что это было бы яснее в моем конкретном случае использования - яснее, чем использование относительных путей или добавление этого каталога в @INC.

Изменить: пояснение:

Я надеялся избежать необходимости перебирать каждый элемент в @INC и вместо этого напрямую указывать, какой файл меня интересует. Например, в Node.JS require('something') будет искать в списке путей, но require('/specific/something') перейдет прямо туда, где я говорю это к.

В Perl я не уверен, что это та же функция, что и в require, но похоже, что она работает.

Однако для операторов use требуются голые слова. Это оставило меня в тупике, как вступить на абсолютный путь.


person 700 Software    schedule 13.02.2013    source источник
comment
Оператор use lib перед use module будет правильным для вашего случая. Но почему вы не можете использовать require. Это больше подходит для вашей проблемы. Также вы можете SetEnv PERL5LIB переменную среды в apache conf, чтобы применить этот каталог для всего проекта или приложения.   -  person    schedule 14.02.2013
comment
Мне нужен .pm файл. Я не пробовал, но похоже, что это не сработает. Обычно я вызываю функции в модуле с синтаксисом типа CGI::ReadParse(); или use CGI ':cgi';. Я не знаю, как я мог бы сделать это с require для файла .pm, но если бы я мог сделать это с require, это действительно решило бы мою проблему.   -  person 700 Software    schedule 14.02.2013
comment
Оно работает. Попробуйте сделать это так require "Newmodule.pm";, а затем позвоните Newmodule::subname();. Выполняется нормально.   -  person    schedule 14.02.2013


Ответы (5)


Согласно обсуждению в комментариях, я бы предложил использовать сам require. Как показано ниже,

require "pathto/module/Newmodule.pm";

Newmodule::firstSub();

Также вы можете использовать другие варианты, как показано ниже

  • use lib 'pathto/module'; Эту строку необходимо добавить в каждый файл, в котором вы хотите использовать модуль.

используйте lib 'pathto / module';
используйте Newmodule;

  • используя PERL5LIB переменную среды. Задайте это в командной строке с помощью экспорта или добавьте в ~/.bashrc, чтобы при каждом входе в систему он добавлялся в ваш @INC. Помните, что PERL5LIB добавляет каталог перед всеми каталогами @INC. Так что он будет использован в первую очередь. Также вы можете установить его в apache httpd.conf, используя

    SetEnv PERL5LIB /fullpath/to/module
    
  • Или установите его в блоке BEGIN.

person Community    schedule 14.02.2013

Вы можете использовать это:

use lib '/path/to/Perl_module_dir'; # can be both relative or absolute
use my_own_lib;

Вы можете изменить @INC самостоятельно (временно, не бойтесь, это то же самое, что use lib):

BEGIN{ @INC = ( '/path/to/Perl_module_dir', @INC ); } # relative or absolute too
use my_own_lib;
person Gilles Quenot    schedule 13.02.2013
comment
Последнее очень похоже на то, что делает use lib, за исключением того, что в нем используется unshift вместо pop, чтобы убедиться, что ваши собственные модули выбираются раньше, чем что-либо еще с таким же именем. - person Borodin; 13.02.2013
comment
POST отредактировал соответственно, чтобы вставить в начало массива. - person Gilles Quenot; 13.02.2013
comment
размещение модуля в том же каталоге, что и ваша программа, работает нормально, только если это ваш рабочий каталог. . != dirname <program> по умолчанию ... - person pavel; 13.02.2013
comment
и работает только тогда, когда. находится в @INC (неверно в режиме заражения; неверно для дистрибутивов, которые опускают его для большей безопасности) - person ysth; 13.02.2013
comment
Этот последний комментарий неверен. Perl не ищет модули в каталоге сценария. Он обычно смотрит в ., но не всегда, а . часто является каталогом скрипта, но далеко не всегда. - person ikegami; 14.02.2013
comment
use lib также добавляет каталоги архива в указанных каталогах в @INC. - person ikegami; 14.02.2013
comment
Код, который вы утверждаете, изменяет @INC временно, не изменяет его более временно, чем use lib. - person ikegami; 14.02.2013

Вообще говоря, установите PERL5LIB переменную среды.

export PERL5LIB=/home/ikegami/perl/lib

Если модуль, который нужно найти, предназначен для установки в каталог, относящийся к сценарию, используйте следующее:

use FindBin qw( $RealBin );
use lib $RealBin;
  # or
use lib "$RealBin/lib";
  # or
use lib "$RealBin/../lib";

Это будет правильно обрабатывать символические ссылки на скрипт.

$ mkdir t

$ cat >t/a.pl
use FindBin qw( $RealBin );
use lib $RealBin;
use Module;

$ cat >t/Module.pm
package Module;
print "Module loaded\n";
1;

$ ln -s t/a.pl

$ perl a.pl
Module loaded
person ikegami    schedule 13.02.2013

Вы можете использовать модуль Module :: Load.

use Module::Load;
load 'path/to/module.pm';
person user2050283    schedule 13.02.2013
comment
Нет никаких указаний на то, что он хочет загрузить модуль во время выполнения, поэтому вы должны заключить модуль в BEGIN. Он также не предоставляет средств для импорта символов, поэтому вам также придется добавить вызов import в блоке BEGIN. В целом плохое решение для того, что хочет сделать OP. - person ikegami; 14.02.2013

FindBin :: libs делает свое дело:

# search up $FindBin::Bin looking for ./lib directories
# and "use lib" them.

use FindBin::libs;
person creaktive    schedule 13.02.2013
comment
Он использует FindBin :: libs использует $ FindBin: Bin вместо $ FindBin: RealBin, поэтому он не работает при использовании символической ссылки на скрипт :( - person ikegami; 14.02.2013