如何动态更改Perl模块路径?

时间:2010-02-01 18:24:06

标签: perl module

我有两个不同版本的Perl模块。目前,关键脚本使用环境变量指定的模块版本,系统依赖于不同用户运行的不同任务。用户的环境将决定使用哪个版本的Perl模块。

现在我想将其更改为Perl脚本中指定的版本,即取决于传递的选项。不幸的是,这样的代码:

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

不起作用。 Perl只需将 newdir ,然后 olddir 附加到@INC,然后运行该脚本。

如何动态指定要使用的模块?

3 个答案:

答案 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模块。