2010-09-08 44 views
-1

我有一個使用已安裝軟件包的Perl腳本。一個是Perl包,另一個是Perl XS包。如何將Perl模塊包含與程序相關的路徑?

現在我想調用此腳本,但使用未安裝的包,但使用路徑名稱相同的包。

我以前perl -I /home/.../lib script.pl,但它不工作

我該怎麼辦呢?

+3

看哥們,不工作是一個強烈的聲明。它整天坐在沙發上嗎?它在你臉上嗎?它需要更多的錢嗎?它和你的女朋友在睡覺嗎?請具體! :-) – rafl 2010-09-08 14:11:54

+0

所以問題是你正在嘗試加載你自己的軟件包,但是正在加載一個默認軟件包呢? – flies 2010-09-08 17:51:21

回答

1

您可以使用lib編譯指示將路徑前綴到路徑perl用於查找模塊。

所以,如果有一個名爲安裝在默認目錄Foo模塊和安裝在/home/cowens/perl5不同的版本,你可以說

use lib "/home/cowens/perl5"; 
use Foo; 

perl將在/home/cowens/perl5找到的版本。

+0

不幸的是,這不是我的腳本,所以我不能修改它。我只是可以運行它的選項 – Nikita 2010-09-08 14:11:36

5

對於影響您的模塊被加載的各種方法,請參閱本SO發佈:

How is Perl's @INC constructed? (aka What are all the ways of affecting where Perl modules are searched for?)

+0

我已經嘗試了列表中的每個aproach /但它沒有幫助/我仍然不能使用我自己的模塊( – Nikita 2010-09-08 14:36:24

+1

)您需要指定確切的軟件包名稱,以幫助我們更詳細地 - 提供'use xxx'行 – DVK 2010-09-08 14:47:22

+1

另外,請指定模塊代碼的確切目錄結構 – DVK 2010-09-08 14:59:49

1

,你能否告訴我們的目錄的遞歸上市那裏你存儲你想要的模塊使用? ls -R可以幫助我們找出是否有正確的路徑。

當您使用-I開關時,您必須確保您在那裏找到正確的路徑。如果你使用一個模塊:

use Some::Module; 

的Perl實際上看起來爲:

$lib/Some/Module.pm 

$lib@INC的目錄之一。另一種說法是,如果特定目錄不在@INC中,Perl不會查看它。這意味着Perl不會自動在你的子目錄中查找

如果你的模塊不在那個位置,那麼Perl不會在那個$lib周圍翻遍尋找它。你的XS模塊可能不是這樣存儲的。它可能路徑中有一個Perl的版本和結構的項目,所以你可能會發現它在:

$lib/5.10.1/darwin-2level/Some/Module.pm 

你需要,如果你正在使用-I自己添加這些路徑。

但是,您可以在命令行上加載模塊。這是很容易使用lib,增加了額外的目錄,爲您提供:

perl -Mlib=/path/to/lib ... 
+0

-I和-Mlib的優缺點什麼 – justintime 2010-09-09 01:08:17

+1

好處和風險取決於你在做什麼。還有一個是向@INC添加arch和版本dirs,無論好壞取決於你想要的。 – 2010-09-09 05:11:53

相關問題