2011-10-07 110 views
5

這裏使用FindBin是該方案,我有兩個文件: 1. DIR/A.pm 2. DIR/NEW_DIR /在在多個模塊

這是A.pm的樣子:

package A; 
use FindBin; 
use Test::More; 
is (FindBin->again, 'dir', 'got dir'); 
1;      

這是怎樣的樣子:

use FindBin; 
use Test::More qw(no_plan); 
use A; 
is (FindBin->again, 'dir/new_dir', 'got dir/new_dir'); 

於是我就在文件中使用Perl NEW_DIR/AT和期待我的測試通過。但這是我的測試結果:

not ok 1 - got dir 
# Failed test 'got fir' 
# at A.pm line 6. 
#   got: 'dir/new_dir' 
#  expected: 'dir' 
ok 2 - got dir/new_dir 
1..2 

我做錯了什麼?我對perl很陌生。請幫忙!!

回答

7

作爲Dave Sherohman notes,FindBin用於查找主腳本的位置,而不是單個模塊。從文檔:

NAME 
     FindBin - Locate directory of original perl script 

(誠然,文檔確實有點混亂,請參閱「模塊」中的「已知問題」一節中,但它並不真正意味着什麼,你認爲這意味着通過。)

無論如何,如果您使用perldoc -m FindBin查看源代碼,您將看到FindBin從$0變量中獲取腳本的路徑。如果你有興趣在尋找通過use(或require)包括一個模塊的位置,你應該看看%INC下代替,像這樣:

package Foo::Bar; 
use File::Spec; 
my ($vol, $dir, $file) = File::Spec->splitpath($INC{'Foo/Bar.pm'}); 
+0

「無可否認,文檔中有些混淆地提到」已知問題「一節中的」模塊「,但這並不意味着您認爲它的意思。」 - 我想我誤解了FindBin->的含義。我現在很清楚。感謝所有的幫助! – junbon

3

如果我正確地理解了這個問題,a.t位於dir/new_dir/目錄中,並且您正在使用new_dir/a.tdir/運行它,對不對?

如果是這樣,那麼它正在做正確的事情。由於a.tdir/new_dir,應始終從FindBin得到dir/new_dir - 它的工作是查找元(程序),沒有發現它正在從所謂的文件,這樣的結果將是相同的A.pm作爲它在a.t

->again函數用於在相同的perl解釋器中運行完全不同程序的實例,如mod_perl所做的,而不是僅僅在單個程序中使用不同的模塊。

5

FindBin發現的Perl推出了文件的位置,而不是正在執行的文件。

我不明白爲什麼你需要的路徑模塊— File::ShareDir可用於訪問模塊的數據文件—但下面會發現:

use Cwd   qw(realpath); 
use File::Basename qw(dirname); 

my $module_dir = dirname(realpath(__FILE__)); 

同樣的警告作爲查找:: Bin適用:僅在chdir尚未更改時適用。

+0

太棒了!感謝提到File :: ShareDir,不知道這一點。 –