比方说,有三条路径中@INC:path1,path2和path3.在每个路径下,都有一个名为的模块foo.pm.如果我现在加载foo.pm我的脚本use foo;,哪个foo.pms实际上将被加载?或者换句话说,perl的路径搜索顺序是@INC什么?
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将首先搜索.
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'的同一目录中,但可能是您有一些混乱的路径.
| 归档时间: |
|
| 查看次数: |
2985 次 |
| 最近记录: |