У меня есть две различных версии модуля Perl. В настоящее время решающий сценарий использует версию модуля, определенного переменной среды, и система полагалась на различные задачи, выполняемые различными пользователями. Среда пользователя определила бы, какая версия модуля Perl использовалась.
Теперь я хотел бы измениться, это к версии, определяемой в сценарии Perl, т.е. в зависимости от опций, передало. К сожалению, кодируйте как это:
if ($new){ use lib "newdir"; }
else{ use lib "olddir"; }
use module;
не работает. Perl просто добавляет newdir и затем olddir к @INC
и затем выполняет сценарий.
Как я динамично определяю который модуль использовать?
Вам нужно использовать BEGIN{}
блок, чтобы ваш if
--
-
код запускался во время компиляции:
BEGIN {
if ($new) { unshift @INC, "newdir"; }
else { unshift @INC, "olddir"; }
}
use module;
Вы также можете установить переменную окружения PERL5LIB
, чтобы вам не приходилось выполнять такую конфигурацию в скрипте.
На CPAN имеется только прагма, которая облегчает установку и последующее использование нескольких версий одного и того же модуля.
Если вы предпочтете, чтобы ваша логика произошла во время выполнения (например, если $ новая переменная производится в некотором сложном сложном способе, что вы не хотите работать в блоке «Начать), вы можете использовать требующую () Загрузить модуль во время выполнения.
Важно помнить, что
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.