我正在研究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
答案 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类,这通常也可以安全地跳过。