2010-10-18 39 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每天变得更加流行,它可能在您的系统上。