动态使用perl模块

时间:2012-05-02 07:19:45

标签: perl dynamic module eval

我正在研究perl项目,我必须动态使用perl模块。我有以下模块叫CT.pm:

sub new {
    my $class = shift;
    my ($debug, $debug_matches,%checkHash) = @_;
    my $self = {};
    $self->{DEBUG} = shift;
    $self->{DEBUG_MATCHES} = shift;
    $self->{CHECKRESULT_OK} = "COMPLIANT"; 
    $self->{CHECKRESULT_ERROR} = "NONCOMPLIANT"; 
    %{$self->{checkHash}} = %checkHash;

    eval{
        use $checkHash{"type"};
        $check = $checkHash{"type"}->new($self->{DEBUG},$self->{DEBUG_MATCHES},%checkHash);
    };

    bless($self,$class);
    return $self;
}

此构造函数获取名为%checkHash的哈希作为参数。此哈希有一个名为type的键。此键映射到我想动态使用的perl模块名称的值。

我想出了以下方法:(我知道不会工作,我也知道人们说eval很糟糕):

eval{
    use $checkHash{"type"};
    $check = $checkHash{"type"}->new($self->{DEBUG},$self->{DEBUG_MATCHES},%checkHash);
};

但我的想法是动态使用名为$ checkHash {“type”}的perl模块。

如果有人对如何做到这一点有任何想法请帮助:) thx! :d

1 个答案:

答案 0 :(得分:1)

你的eval是一个“块eval”,它实际上只是Perl中的一个异常捕获机制,缺少与通常的“字符串eval”相关的任何耻辱。您可以通过eval "require $checkHash{'type'}"动态加载带有字符串eval的模块。如果您希望完全避免使用字符串eval,您只需手动将裸字模块名称转换为.pm文件路径即可。您仍然应该使用块eval来捕获模块加载异常:

my $file = $class . '.pm';
$file =~ s{::}{/}g;
eval { require $file };
if($@){ die "failed to load $class: $@" }

这仍然不会运行加载的类import方法。您需要将类路径分解为碎片并手动找到它。对于OO类,这通常也可以安全地跳过。