什么';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
。文件中的顺序位置不一定指示顺序处理。请参阅可能的重复(该问题涵盖更多领域,但它包括此问题。)可能的重复。也看到