perl中的搜索顺序包括加载模块时的路径

时间:2011-12-02 14:01:46

标签: perl

假设@INC中有三条路径:path1path2path3。在每个路径下,都有一个名为foo.pm的模块。如果我现在通过foo.pm在我的脚本中加载use foo;,那么foo.pm中的哪一个实际上会被加载?或者换句话说,@INC中路径的perl搜索顺序是什么?

2 个答案:

答案 0 :(得分:7)

perldoc -v %INC显示选择了哪条路径:

use Data::Dumper; 
print Dumper(\%INC);

或者...

perl -Mfoo -e 'print $INC{"foo.pm"}'

require显示了一些暗示搜索顺序的伪代码:

foreach $prefix (@INC) {
}

因此,首先会搜索path1

答案 1 :(得分:6)

path1,path2,path3。并且perl将加载path1/foo.pm

为什么你会期望它是其他任何一个?

查看perlfunc perlvar,我可以看到他们明确这样说,但他们确实说:

  

数组@INC包含EXPR,require或使用构造查找其库文件的位置列表。

我认为那里的提示是 list 。期望首先处理列表是没有例外的。

您可以在use foo;声明之前放置此代码:

BEGIN { say "\@INC=(${\join( ', ', @INC )})"; }

如果仍然显示@INC=(/path1, /path2, /path3),请将其放在use声明之后:

BEGIN { say "\$INC{'foo.pm'}=$INC{'foo.pm'}"; }

如果那个仍显示$INC{'foo.pm'}=/path3/foo.pm,那么我认为您没有尽可能地指定搜索路径。您可能认为在{/ path1'指定的同一目录中有foo.pm,但可能是您遇到了一些混乱的路径。