2011-12-02 29 views
1

假设@INC有三条路径:path1,path2path3。在每个路径下,都有一个名为foo.pm的模块。如果我现在通过use foo;在我的脚本中加载foo.pm,那么foo.pm中的哪一个实际上将要加载?换句话说,在@INC中perl的路径搜索顺序是什么?当模块加载时,perl包含路径中的搜索顺序是什么

+1

请显示您用于加载模块的确切代码。 '使用foo.pm'看起来不对。 – toolic

+0

@toolic:这是一个错字... –

+1

可能的重复[如何选择不与内建或CPAN软件包名称相冲突的自定义Perl模块的软件包名称?](http://stackoverflow.com/questions/ 658955/how-do-i-choose-a-package-name-for-a-custom-perl-module-that-not-collide-wi)(这个问题涵盖了更多的内容,但它包含了这个问题。) – cjm

回答

6

path1,path2,path3。而perl将加载path1/foo.pm

你为什么期望它是其他的?

看着perlfunc perlvar,我可以看到,他们不明确这样说,但他们说:

数组@INC包含该做EXPR位置列表,需要或使用结构查找他们的库文件。

我觉得那里的提示是列表。期望列表被首先处理,这是没有意义的。

你也许可以把这个代码,您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,但可能是你有一些路径搞砸了。

+0

\ @Axeman:我打印@INC,打印的顺序是path1 ,path2和path3,我也希望它的path1/foo.pm被加载,但在我的情况下,path3/foo.pm被加载。这里有两种可能,一种是打印的顺序与搜索顺序相反,或者是某种疯狂的...... –

+1

@HaiyuanZhang'@ INC'应该按顺序打印,因为它是一个列表。也许你在'BEGIN'块之后运行的东西中用'@ INC'做了一些操作(并且记住'use'是一个隐含的'BEGIN'块)。所以你可以编写这样的代码:'unshift @INC,qw;使用foo;'并且最终在path3中实现'foo'。文件中的顺序位置不一定指示顺序处理。见['use'](http://perldoc.perl.org/functions/use.html) – Axeman

+1

@HaiyuanZhang:你是如何确定使用path3/foo.pm而不是'path1/foo.pm'的? – toolic

6

perldoc -v %INC显示了在所选择的道路:

use Data::Dumper; 
print Dumper(\%INC); 

或者......

perl -Mfoo -e 'print $INC{"foo.pm"}' 

require展示了一些伪代码,这意味着搜索顺序:

foreach $prefix (@INC) { 
} 

因此,首先搜索path1