Как мне динамически изменить путь модуля Perl? - PullRequest
9 голосов
/ 01 февраля 2010

У меня есть две разные версии модуля Perl. В настоящее время критический сценарий использует версию модуля, заданную переменной среды, и система полагалась на разные задачи, выполняемые разными пользователями. Среда пользователя будет определять, какая версия модуля Perl была использована.

Теперь я хотел бы изменить это на версию, указанную в скрипте Perl, то есть в зависимости от переданных параметров. К сожалению, такой код:

if ($new){ use lib "newdir"; }
else{ use lib "olddir"; }
use module;

не работает. Perl просто добавляет newdir , а затем olddir к @INC и затем запускает скрипт.

Как динамически указать, какой модуль использовать?

Ответы [ 3 ]

16 голосов
/ 01 февраля 2010

Вам необходимо использовать блок BEGIN{}, чтобы ваш код if - else был запущен во время компиляции:

BEGIN {
    if ($new) { unshift @INC, "newdir"; }
    else {      unshift @INC, "olddir"; }
}
use module;

Вы также можете установить переменную окружения PERL5LIB, чтобы вам не пришлось выполнять такую ​​настройку в сценарии.

13 голосов
/ 01 февраля 2010

На CPAN существует прагма only , которая упрощает установку и последующее использование нескольких версий одного и того же модуля.

3 голосов
/ 02 февраля 2010

Если вы предпочитаете, чтобы ваша логика происходила во время выполнения (например, если переменная $ new создается более сложным способом, который вы не хотите запускать в блоке BEGIN), вы можете использовать require () загрузить модуль во время выполнения.

Важно помнить, что

use Module;
use ModuleWithExports qw(export1 export2);

То же, что и

BEGIN { require Module; Module->import() }
BEGIN {
    require ModuleWithExports;
    ModuleWithExports->import('export1', 'export2');
}

Это означает, что для запуска вашего кода во время выполнения вы можете просто:

if ($new) {
    unshift @INC, "newdir";
}
else {
    unshift @INC, "olddir";
}
require module;
module->import(); # if necessary

Альтернативой использованию require () является использование модуля Module :: Load из CPAN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...