2011-12-02 27 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