如何将特定库用于特定的perl模块?

时间:2016-06-02 08:59:43

标签: perl perl-module

我使用了两个库,在它们下面是我需要的模块:

  • perl_lib /富
    • person.pm
    • dictionary.pm
  • perl_lib /酒吧
    • person.pm

我想对 dictionary.pm 模块使用 perl_lib / foo ,但我想将 perl_lib / bar 用于 person.pm 模块。

我明白使用lib行的顺序在这里很重要,下面的内容让我使用bar / Person.pm,然后是foo / Dictionary.pm:

use lib 'perl_lib/bar';
use lib 'perl_lib/foo';

但是,在我们的代码中,perl_lib / bar被导出到perl脚本之外,而perl_lib / foo仍在使用,如上所示:

export PERL5LIB='perl_lib/bar:$PERL5LIB'

有了这个,perl_lib / foo将获得Person.pm

的优先权

是否还有其他方法可以指定哪些库来获取特定模块?

我试过这个:

push @INC, 'perl_lib/foo'

这样foo就会获得最后的优先权。 (使用,对@INC使用类似'unshift'的行为。最后一个获得不移位的将获得优先权)它可以工作,但它有点乱。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:4)

PERL5LIB的内容和use lib的参数未移位@INC数组的开头,所以如果你有

export PERL5LIB=a:b

然后运行程序

use lib qw/ c d /;
use lib e;

您的@INC数组现在将以

开头
'e', 'c', 'd', 'a', 'b', ...

use语句按照它们在@INC中出现的顺序扫描库,因此通常添加到数组的 last 文件夹是先搜索 。听起来您想要扫描perl_lib/bar后跟perl_lib/foo,以便找到正确的person.pm文件。您可以使用

创建它
use lib qw{ perl_lib/bar perl_lib/foo }; 

use lib 'perl_lib/foo';
use lib 'perl_lib/bar';

这与你已经拥有的相反。我觉得将所有目录放在一个use lib更好的表示它们将被添加到@INC的顺序,以及它们的搜索优先级

对于PERL5LIB的内容,您可以use lib以不同的优先级再次添加该目录。环境变量中的旧条目仍然存在,但它只会被搜索两次。如果你想保持整洁并对编译时间进行一些改进,那么你可以先用

删除它。
no lib 'perl_lib/bar'

在按照您真正想要的顺序添加目录之前

还有一件事,您的文件应该是Person.pmDictionary.pm,它们应分别包含package Personpackage Dictionary

  

我试过这个:

push @INC, 'perl_lib/foo'
     

这样foo就会获得最后的优先权。 (使用,对'@INC使用'非移动'的行为。最后一个获得不移位的将获得优先权。它有效,但有点乱。有没有更好的方法呢?

我不确定你的意思。正如我所说,perl从开头扫描@INC的内容,因此使用push只会将另一个非常低优先级的目录添加到搜索列表中。如果该目录已经出现在数组的其他位置,那么添加将没有区别,除了在perl声明它找不到模块文件之前第二次搜索目录


更新

您已经要求使用use加载特定模块的方法,而不管@INC的内容如何。这似乎不是原始问题的驱动因素,但您可以使用require执行此操作,这允许指定文件路径而不是裸字模块名称。您应该将其放入BEGIN块,如果您的模块使用Exporter,那么您还需要调用import子例程,就像这样

BEGIN {
    require 'perl_lib/bar/Person.pm';
    Person->import();
}

但这是非常丑陋的Perl,我不建议在程序中使用硬编码模块路径。您已经说过,您认为push @INC, 'perl_lib/foo'有点凌乱,所以我不知道它是否有帮助

您也可以暂时覆盖该库的@INC的全部内容,例如

BEGIN {
    local @INC = 'perl_lib/bar';
    require Person;
    Person->import();
}

但我不确定这是否有所改善

如果我现在正确地解释了你的问题,请告诉我?