什么';s perl'中的搜索顺序;加载模块时包含路径
假设在什么';s perl'中的搜索顺序;加载模块时包含路径,perl,Perl,假设在@INC中有三条路径:path1、path2和path3。在每个路径下,都有一个名为foo.pm的模块。如果我现在通过使用foo在脚本中加载foo.pm,实际要加载的是foo.pms中的哪一个?或者换句话说,perl在@INC中对路径的搜索顺序是什么?路径1、路径2、路径3。perl将加载path1/foo.pm 你为什么期望它是其他的呢 看看,我可以看到他们没有明确地说,但他们确实说: array@INC包含do EXPR、require或use构件查找其库文件的位置列表 我认为清单上的
@INC
中有三条路径:path1
、path2
和path3
。在每个路径下,都有一个名为foo.pm
的模块。如果我现在通过使用foo在脚本中加载foo.pm
,实际要加载的是foo.pm
s中的哪一个?或者换句话说,perl在@INC
中对路径的搜索顺序是什么?路径1、路径2、路径3。perl将加载path1/foo.pm
你为什么期望它是其他的呢
看看,我可以看到他们没有明确地说,但他们确实说:
array@INC包含do EXPR、require或use构件查找其库文件的位置列表
我认为清单上的提示是正确的。期望一个列表从头到尾都能得到处理是很正常的
您可以将此代码放在使用foo之前代码>语句:
BEGIN { say "\@INC=(${\join( ', ', @INC )})"; }
BEGIN { say "\$INC{'foo.pm'}=$INC{'foo.pm'}"; }
如果仍然显示@INC=(/path1,/path2,/path3)
,则将其放在use
语句之后:
BEGIN { say "\@INC=(${\join( ', ', @INC )})"; }
BEGIN { say "\$INC{'foo.pm'}=$INC{'foo.pm'}"; }
如果那一个仍然显示$INC{'foo.pm'}=/path3/foo.pm
,那么我认为您没有尽可能地指定搜索路径。您可能认为您的foo.pm
位于指定为“/path1”的同一目录中,但很可能是您的某些路径被弄乱了 显示选择的路径:
use Data::Dumper;
print Dumper(\%INC);
或者
显示一些表示搜索顺序的psuedo代码:
foreach $prefix (@INC) {
}
因此,path1
将首先被搜索。\@Axeman:I print@INC,打印顺序是path1、path2和path3,我也希望加载的是path1/foo.pm,但在我的情况下加载的是path3/foo.pm。这里有两种可能,一种是打印的顺序与搜索顺序相反,或者是一些疯狂的事情…@HaiyuanZhang@INC
应该按顺序打印,因为它是一个列表。也许您在开始
块之后运行的某个程序中使用@INC
进行了一些操作(请记住使用
是一个隐式开始
块)。所以你可以这样写代码:unshift@INC,qw;使用foo代码>并最终在路径3中实现foo
。文件中的顺序位置不一定指示顺序处理。请参阅可能的重复(该问题涵盖更多领域,但它包括此问题。)可能的重复。也看到