2009-08-18 124 views
5

在我的應用程序中,我將所有模塊放在一個目錄中,我們將其稱爲libx。 由於要由用戶選擇應用程序的部署位置,因此我不想對lib路徑進行硬編碼。爲什麼「use lib」不能以這種方式生效?

所以在myapp.pl開始,我寫了下面的代碼行。

#! /usr/bin/perl -w 
use strict; 

my $curr_dir = $0; 
my $curr_lib = $curr_dir; 
$curr_lib =~ s/myapp\.pl/libx/; 

use $curr_lib ; 

沒有得到我期待的東西,我得到了編譯錯誤!

那麼,我的代碼有什麼問題?我不想在使用use lib時對lib路徑進行硬編碼,我應該怎麼做?


對不起,我忘了提,當應用程序部署,myapp.pllibx在同一個目錄下。

回答

15

使用發生在編譯時,不運行時,讓你的變量尚未設置。 你可以這樣做:

my $curr_lib; 
BEGIN { 
    $curr_lib = $0; 
    $curr_lib =~ s/myapp\.pl/libx/; 
}  
use lib $curr_lib; 

,或者你可以:

use FindBin; 
use lib "$FindBin::Bin/libx"; 
2

我以前也遇到過麻煩。現在發生的事情是,Perl會對您的代碼進行兩次傳遞:一次編譯它,然後第二次運行它。在你的例子中,4,5和6行直到運行時才執行,但use在編譯時生效。

一種可能是把它全部BEGIN{}塊內,這將使得代碼在編譯時執行。我已經完成了這個,但它很凌亂/醜陋。 (順便說一句,而不是$0,你需要在Perl中使用$ARGV[0])。

告訴Perl的地方去接庫的最好方法是使用-I標誌。你可以把它放在#!線,或者如果你是從另一個腳本啓動腳本,你可以啓動它

 
perl -I/your/directory/libx your_script.pl 

可以使用相對路徑,所以也許

 
perl -I./libx script.pl 

會爲你工作。

+0

如果您告訴我們您期望您的用戶如何啓動應用程序,這將有所幫助。他們只會輸入「myapp」。pl',這取決於他們的$ PATH設置,以便myapp.pl可以在任何他們卡住的目錄中找到? – 2009-08-18 05:45:10

1

use xxx編譯時指令,而不是運行時指令。您不能在正在運行的腳本中以編程方式設置它。

您可能需要嘗試require rather than use

如果需要use,你需要設置你的$PERL5LIB環境變量,以確保您的模塊被正確地定位和使用,或者改變你的家當行改爲#! /usr/local/perl -w -I/path/to/libx。還有其他方法(local::lib等),但從您的問題看來,您對安裝的控制對於這種方法有點受限。

+1

這不是100%真的,你可以在運行時使用字符串'eval'來執行'use'。 – 2009-08-18 13:46:55

相關問題