2010-10-18 44 views
3

我有一個Perl腳本,它使用了一個不那麼常見的模塊,我希望它可以在未安裝該模塊的情況下使用,儘管功能有限。可能嗎?如何在Perl中有條件地導入包?

我認爲是這樣的:

my $has_foobar; 
if (has_module "foobar") { 
    << use it >> 
    $has_foobar = true; 
} else { 
    print STDERR "Warning: foobar not found. Not using it.\n"; 
    $has_foobar = false; 
} 

回答

6

您可以使用require在運行時加載的模塊,並eval陷阱可能的例外:

eval { 
    require Foobar; 
    Foobar->import(); 
}; 
if ([email protected]) { 
    warn "Error including Foobar: [email protected]"; 
} 

也見的perldoc use

+4

如果您打算調用'import',那麼您可能想要將其封裝在'BEGIN'塊中,以便在編譯時發生。否則,'import'不太可能有用。 – cjm 2010-10-18 08:56:53

2

我建議僱用Module::Load以便intention is made clear

編輯:無視評論,Module::Load is in core

+0

問題在於Module :: Load也是在每個系統上都沒有安裝的東西。 – petersohn 2010-10-18 11:01:18

+1

這不是問題。 [聲明依賴項](http://search.cpan.org/CPAN::Meta::Spec#prereqs),CPAN會自動在您的模塊/程序之前安裝它。 – daxim 2010-10-18 11:30:05

+0

對於您(開發人員)完全控制的環境,這是一個很好的建議。有些環境不是這樣的(例如,大型公司,Perl庫只允許在軟件工程控制的位置進行安裝,並且必須由該團隊進行審查)。 – DVK 2010-10-18 13:45:18

4

請考慮if編譯指示。

use if CONDITION, MODULE => ARGUMENTS; 
0

另一種方法是使用類:: MOP的load_class方法。您可以使用它像:

類:: MOP :: load_class( 'foobar的',$ some_options)

它拋出一個異常,所以你必須抓住這一點。更多信息here

此外,雖然這不一定在每個系統上,但Class :: MOP對於擁有非常有用,並且隨着Moose每天變得更加流行,它可能在您的系統上。