我有两个不同版本的Perl模块。目前,关键脚本使用环境变量指定的模块版本,系统依赖于不同用户运行的不同任务。用户的环境将决定使用哪个版本的Perl模块。
现在我想将其更改为Perl脚本中指定的版本,即取决于传递的选项。不幸的是,这样的代码:
if ($new){ use lib "newdir"; }
else{ use lib "olddir"; }
use module;
不起作用。 Perl只需将 newdir ,然后 olddir 附加到@INC
,然后运行该脚本。
如何动态指定要使用的模块?
答案 0 :(得分:16)
您需要使用BEGIN{}
块,以便在编译时运行if
- else
代码:
BEGIN {
if ($new) { unshift @INC, "newdir"; }
else { unshift @INC, "olddir"; }
}
use module;
您还可以设置PERL5LIB
环境变量,这样您就不必在脚本中进行此类配置。
答案 1 :(得分:13)
CPAN上有一个only pragma,可以轻松安装然后使用同一模块的多个版本。
答案 2 :(得分:3)
如果您希望在运行时发生逻辑(例如,如果$ 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()的替代方法是使用CPAN中的Module::Load模块。