假设@INC
有三条路径:path1
,path2
和path3
。在每个路径下,都有一个名为foo.pm
的模块。如果我现在通过use foo;
在我的脚本中加载foo.pm
,那么foo.pm
中的哪一个实际上将要加载?换句话说,在@INC
中perl的路径搜索顺序是什么?当模块加载时,perl包含路径中的搜索顺序是什么
回答
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
,但可能是你有一些路径搞砸了。
\ @Axeman:我打印@INC,打印的顺序是path1 ,path2和path3,我也希望它的path1/foo.pm被加载,但在我的情况下,path3/foo.pm被加载。这里有两种可能,一种是打印的顺序与搜索顺序相反,或者是某种疯狂的...... –
@HaiyuanZhang'@ INC'应该按顺序打印,因为它是一个列表。也许你在'BEGIN'块之后运行的东西中用'@ INC'做了一些操作(并且记住'use'是一个隐含的'BEGIN'块)。所以你可以编写这样的代码:'unshift @INC,qw path1/path2>;使用foo;'并且最终在path3中实现'foo'。文件中的顺序位置不一定指示顺序处理。见['use'](http://perldoc.perl.org/functions/use.html) – Axeman
@HaiyuanZhang:你是如何确定使用path3/foo.pm而不是'path1/foo.pm'的? – toolic
perldoc -v %INC显示了在所选择的道路:
use Data::Dumper;
print Dumper(\%INC);
或者......
perl -Mfoo -e 'print $INC{"foo.pm"}'
require展示了一些伪代码,这意味着搜索顺序:
foreach $prefix (@INC) {
}
因此,首先搜索path1
。
- 1. 包含perl模块时的搜索顺序问题
- 2. Django:当使用register.inclusion_tag()时,模板搜索的是/什么顺序?
- 3. 如何将Perl模块包含与程序相关的路径?
- 4. 附加包含目录中添加的路径是什么?
- 5. 在加载时查找Perl模块的路径
- 6. 设置autoconf的包含搜索路径
- 7. 库搜索路径条目的顺序
- 8. 此模板中的正确包含路径是什么?
- 9. 在简单的Perl中为模块添加一个包含路径教程
- 10. 什么是标准ada包含路径
- 11. 设置CMake的模块搜索路径
- 12. 如何从IIS6中的相对路径加载Perl模块?
- 13. PHP不搜索包含路径
- 14. CMake系统包含搜索路径
- 15. 获取包含路径cpp搜索
- 16. 不在包含路径搜索
- 17. 当路径包含#
- 18. 什么是“加载模块”?
- 19. Zend表单模块包含路径
- 20. pycharm无法加载包含在解释器路径列表中的模块
- 21. @“../ ..”在路径中的含义是什么?
- 22. Puppet Nodes.pp包含模块执行顺序
- 23. mysql - 为什么当我搜索“ñ”时包含“n”?
- 24. 在加载perl模块之前修改ld.so路径
- 25. Google搜索网址中包含什么?
- 26. 如何向DLL搜索顺序添加路径
- 27. include makefile,什么(搜索路径)(no〜expansion)...是什么意思?
- 28. 为什么包含模块的顺序在Ruby中有所不同?
- 29. 为什么Perl模块Crypt :: SSLeay在加载时会出错?
- 30. 添加路径到Erlang搜索路径?
请显示您用于加载模块的确切代码。 '使用foo.pm'看起来不对。 – toolic
@toolic:这是一个错字... –
可能的重复[如何选择不与内建或CPAN软件包名称相冲突的自定义Perl模块的软件包名称?](http://stackoverflow.com/questions/ 658955/how-do-i-choose-a-package-name-for-a-custom-perl-module-that-not-collide-wi)(这个问题涵盖了更多的内容,但它包含了这个问题。) – cjm