Как я динамично изменяю путь модуля Perl?

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

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

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

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

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

9
задан brian d foy 2 February 2010 в 06:42
поделиться

3 ответа

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

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

Вы также можете установить переменную окружения PERL5LIB , чтобы вам не приходилось выполнять такую конфигурацию в скрипте.

16
ответ дан 4 December 2019 в 07:04
поделиться

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

13
ответ дан 4 December 2019 в 07:04
поделиться

Если вы предпочтете, чтобы ваша логика произошла во время выполнения (например, если $ новая переменная производится в некотором сложном сложном способе, что вы не хотите работать в блоке «Начать), вы можете использовать требующую () Загрузить модуль во время выполнения.

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

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

альтернативу для использования требуется () - использовать Модуль :: Нагрузка Модуль из CPAN.

3
ответ дан 4 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

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