2012-03-29 23 views
0

我有一個調用Perl插件的CGI接口。這些腳本位於不同的文件夾中,Perl應該讀取位於另一個文件夾中的XML文件。爲了簡單起見,我舉一個例子:如何在Perl中檢索腳本路徑? (不是正在運行的)

/a/b/cgi-bin/test.cgi # calls test.pl 
/e/plugins/test.pl # reads config.xml 
/e/etc/config.xml 

現在我不知道如何讓Perl插件讀取配置文件。當然,我不能在腳本上寫下路徑,因爲明天我可能會改變這個文件的位置。我試過在test.pl上使用Cwdabs_path,但是此方法返回「運行」路徑,而我想要test.pl的「位置」路徑,以便可以修改它以便構建config.xml路徑。有任何想法嗎?

編輯:使用realpath而不是abspath解決了我的問題,或者至少看起來如此,我會做更多的測試。

EDIT2:好真實路徑的作品,但現在我有... Perl的插件使用,我提出,但ofcourse現在寫使用MyPackage的一些額外的軟件包另一個問題;不再工作,因爲它看起來在錯誤的文件夾...有沒有辦法修改環境變量?我不知道什麼可以避免我改變數千行代碼。

編輯3:好的解決了這個問題,我想我只是將我的軟件包安裝在INC文件夾中,所以我不必再搞亂我的代碼了。

+0

感覺你忘了在這裏發佈一些信息。如:你如何找到'test.pl'開頭? – TLP 2012-03-29 08:14:35

+0

我有一個告訴test.cgi如何找到插件的小文本文件。 – raz3r 2012-03-29 08:19:05

+0

難道你不能通過該信息(它從哪裏加載'test.pl')到你在插件中調用的任何函數? – 2012-03-29 08:28:56

回答

0

下面的函數會返回一個used()版包的路徑:

use Cwd qw/abs_path/; 

sub get_module_folder { 
    my $mkey = shift; 
    $mkey =~ s|\:\:|/|g; 
    $mkey .= '.pm'; 
    my $mpath = $INC{$mkey}; 
    $mpath =~ s|/[^/]+$||; 
    return abs_path($mpath); 
} 

所以,如果test.pl實現了一個包,說Plugin::Foo,那麼就稱其爲:

use Plugin::Foo; 
open my $f, '<', get_module_folder('Plugin::Foo').'/../etc/config.xml' 
    or die "can't open config file for reading: $!"; 

(假設我已經正確理解你的文件夾結構)。

更新:使用abs_path。

我經常在我自己的模塊中包含這個方法(用__PACKAGE__代替shift),以便他們可以找到他們需要的任何配置/數據。

相關問題