我使用了两个库,在它们下面是我需要的模块:
我想对 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'的行为。最后一个获得不移位的将获得优先权)它可以工作,但它有点乱。有没有更好的方法呢?
答案 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.pm
和Dictionary.pm
,它们应分别包含package Person
和package 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();
}
但我不确定这是否有所改善
如果我现在正确地解释了你的问题,请告诉我?