2013-02-13 5 views
5

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

Edit: Уточнение:.

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

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

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

+0

'use lib' заявление перед' use module' будет правильным для вашего случая. Но почему вы не можете использовать 'require'. Это больше подходит для вашей проблемы. Также вы можете переменную среды SetEnv PERL5LIB в apache conf применять этот каталог для всего проекта или приложения. – 2013-02-14 10:56:37

+0

Мне нужен файл '.pm'. Я не пробовал, но похоже, что все будет правильно. Обычно я вызываю функции в модуле с синтаксисом, например 'CGI :: ReadParse();' или 'use CGI ': cgi';'. Я не знаю, как это сделать с 'require' для файла' .pm', но если бы я мог сделать это с 'require', это действительно решило бы мою проблему. –

+0

Это работает. Попробуйте «require» Newmodule.pm «;», а затем вызовите 'Newmodule :: subname();'. Он отлично работает. – 2013-02-14 14:50:16

ответ

4

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

require "pathto/module/Newmodule.pm"; 

Newmodule::firstSub(); 

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

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

использовать lib 'pathto/module';
использование Newmodule;

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

    SetEnv PERL5LIB /fullpath/to/module 
    
  • Или установить его в НАЧАТЬ блок.

4

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

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; 
+0

Последнее очень похоже на то, что используется 'use lib', за исключением того, что вместо' pop' используется 'unshift', чтобы убедиться, что ваши собственные модули подобраны перед чем-либо с тем же именем. – Borodin

+0

POST отредактирован соответственно для нажатия в начале массива. –

+2

установка модуля в том же каталоге, что и ваша программа, работает только в том случае, если это ваш рабочий каталог. '. ! = dirname 'по умолчанию ... – pavel

0

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

use Module::Load; 
load 'path/to/module.pm'; 
+0

Нет никаких указаний на то, что он хочет загрузить модуль во время выполнения, поэтому вы должны обернуть модуль в' BEGIN'. Он также не предоставляет средства импорта символов, поэтому вам также нужно добавить вызов «import» в блок BEGIN. В целом это плохое решение для того, что хочет сделать ОП. – ikegami

0

FindBin::libs. трюк:

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

use FindBin::libs; 
+0

Он использует FindBin :: libs использует $ FindBin: Bin вместо $ FindBin: RealBin, поэтому он не работает при использовании символической ссылки на скрипт :( – ikegami

1

Вообще говоря, установить 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 
Смежные вопросы