假設@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