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

Hai*_*ang 4 perl

比方说,有三条路径中@INC:path1,path2path3.在每个路径下,都有一个名为的模块foo.pm.如果我现在加载foo.pm我的脚本use foo;,哪个foo.pms实际上将被加载?或者换句话说,perl的路径搜索顺序是@INC什么?

too*_*lic 7

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

use Data::Dumper; 
print Dumper(\%INC);
Run Code Online (Sandbox Code Playgroud)

要么...

perl -Mfoo -e 'print $INC{"foo.pm"}'
Run Code Online (Sandbox Code Playgroud)

require显示一些psuedo-code,暗示搜索顺序:

foreach $prefix (@INC) {
}
Run Code Online (Sandbox Code Playgroud)

因此,path1将首先搜索.


Axe*_*man 6

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

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

看着perlfunc perlvar,我可以看到他们没有明确说出这一点,但他们确实说:

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

我认为那里的提示是清单.期望列表首先被处理是没有意义的.

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

BEGIN { say "\@INC=(${\join( ', ', @INC )})"; }
Run Code Online (Sandbox Code Playgroud)

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

BEGIN { say "\$INC{'foo.pm'}=$INC{'foo.pm'}"; }
Run Code Online (Sandbox Code Playgroud)

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