代码之家  ›  专栏  ›  技术社区  ›  pythonic metaphor

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

  •  9
  • pythonic metaphor  · 技术社区  · 16 年前

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

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

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

    不起作用。Perl只是附加 纽迪尔 然后 奥尔迪尔 @INC 然后运行脚本。

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

    3 回复  |  直到 16 年前
        1
  •  16
  •   mob    16 年前

    你需要使用 BEGIN{} 阻止你 if - else 代码将在编译时运行:

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

    您也可以设置 PERL5LIB 环境变量,这样您就不必在脚本中进行这种配置。

        2
  •  13
  •   ysth    16 年前

    有一个 only pragma on cpan,使安装和使用同一模块的多个版本变得容易。

        3
  •  3
  •   Kaoru    16 年前

    如果您希望逻辑在运行时发生(例如,如果$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()的另一种方法是使用 Module::Load 来自CPAN的模块。