2010-04-07 28 views
5

我使用use lib "./DIR"從其他地方的文件夾中獲取庫。但是,它似乎不能在我的服務器上工作,但它在我的本地桌面上正常工作。 有什麼特別的原因?Perl的lib pragma是如何工作的?

還有一個問題,use lib會在幾個模塊中傳播嗎?

兩種情況: 假設我需要一些庫的基類,但我知道它需要擴展,擴展類需要使用另一個庫。我可以將use lib命令放在基類中嗎?還是我需要把它放在每個擴展課堂上?

最後,我可以只有一個use package其中軟件包包含一堆使用lib,它會傳播使用lib語句到我的當前模塊? < - 我不這麼認爲,但總是詢問

回答

3

use lib語句中的.表示「當前工作目錄」,並且只有當腳本從正確的目錄運行時纔有效。服務器的cwd想法可能有些不同(或未定義)。假設庫目錄協同定位與腳本和私人它,你想要做這樣的事情,而不是:

use FindBin; 
use lib "$FindBin::Bin/DIR"; 

一個use lib語句影響@INC - 位置列表perl的搜索時,你userequire一個模塊。它在全球範圍內影響解釋器的當前實例。您應該只將use lib語句放在腳本中,而不是放在模塊中。

原則上,你可以有一個package MyLibs是由一堆use lib語句,然後use MyLibs使用任何在這些位置的包之前,但我不會推薦它。

+0

我用getcwd弄清楚了哪裏「。」是。只是想知道是否有可能找出perl腳本的位置?當我嘗試使用FindBin時,它不工作,因爲lib和bin不在同一位置。所以這裏是我想要做的一個例子。我從說folder1運行perl腳本。它使用lib「/ abs/path/topack /」;使用包。在包中,我使用lib'./FOLDER2';假設cwd將是相同的。由於「。」指向Folder1,而不是路徑。這是錯誤的。我如何不使用包中的絕對路徑還能夠使用。?可能嗎? – Tyug 2010-04-12 18:55:53

+0

@Tyug:您可以通過檢查'%INC'來確定模塊的加載位置。有關類似的問題,請參閱http://stackoverflow.com/questions/1463414,以便您指出正確的方向。 – 2010-04-12 19:22:54

+0

非常感謝! – Tyug 2010-04-13 12:56:02

2

沒有更多的信息,沒有辦法知道它爲什麼不能在你的服務器上工作。特別是,檢查您的服務器的錯誤日誌,並在需要時轉儲@INC,並將其與您的實際庫路徑進行比較。

use lib修改@INC,這是全球性的,只要您在其他軟件包嘗試包含東西之前執行use lib,它就會工作,所有其他軟件包將看到新的包含路徑。

有關@INC的更多信息,請參見perlvar中的條目。

相關問題