假设@INC
中有三条路径:path1
,path2
和path3
。在每个路径下,都有一个名为foo.pm
的模块。如果我现在通过foo.pm
在我的脚本中加载use foo;
,那么foo.pm
中的哪一个实际上会被加载?或者换句话说,@INC
中路径的perl搜索顺序是什么?
答案 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
,但可能是您遇到了一些混乱的路径。