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

如何动态更改Perl模块路径?,perl,module,Perl,Module,我有两个不同版本的Perl模块。目前,关键脚本使用环境变量指定的模块版本,系统依赖于不同用户运行的不同任务。用户的环境将决定使用哪个版本的Perl模块 现在,我想将其更改为在Perl脚本中指定的版本,也就是说,取决于传递的选项。不幸的是,代码如下: if ($new){ use lib "newdir"; } else{ use lib "olddir"; } use module; 不起作用。Perl只需将newdir和olddir附加到@INC,然后运行脚本 如何动态指定要使用的模块?您需

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

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

if ($new){ use lib "newdir"; }
else{ use lib "olddir"; }
use module;
不起作用。Perl只需将newdir和olddir附加到
@INC
,然后运行脚本


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

您需要使用
开始{}
块,以便在编译时运行
if
-
else
代码:

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


您还可以设置环境变量,这样就不必在脚本中进行此类配置。

CPAN上有一个pragma,可以轻松地安装并使用同一模块的多个版本。

如果您希望在运行时执行逻辑(例如,如果$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中的模块。

您奇怪的括号样式给您留下了一个未闭合的块。(现在,开始括号大战!)另外值得一提的是,“使用lib”和直接操纵@INC并不总是等价的操作。有关更多详细信息,请参阅文档。