-1

我在一个 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 的哈希作为参数。这个散列有一个称为类型的键。此键映射到我要动态使用的 perl 模块名称的值。

我想出了以下方法:(我知道这行不通,我也知道人们说 eval 不好):

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

但想法是动态地使用名称为 $checkHash{"type"} 的 perl 模块。

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

4

1 回答 1

1

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

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

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

于 2012-05-02T08:29:24.343 回答