加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在不使用eval的情况下动态地包含Perl模块?

发布时间:2020-12-15 21:22:02 所属栏目:大数据 来源:网络整理
导读:我需要动态地包含一个Perl模块,但是如果可能的话,由于工作编码标准,我们希望远离eval。这工作: $module = "My::module";eval("use $module;"); 但是如果可能的话,我需要一个没有eval的方法。所有google搜索都会导致eval方法,但是没有任何其他方式。 有
我需要动态地包含一个Perl模块,但是如果可能的话,由于工作编码标准,我们希望远离eval。这工作:
$module = "My::module";
eval("use $module;");

但是如果可能的话,我需要一个没有eval的方法。所有google搜索都会导致eval方法,但是没有任何其他方式。

有没有eval可以做到这一点?

解决方法

在运行时使用 require加载模块。如果模块无法加载,通常会将其包装在块(而不是字符串)eval中。
eval {
    require My::Module;
    My::Module->import();
    1;
} or do {
   my $error = $@;
   # Module load failed. You could recover,try loading
   # an alternate module,die with $error...
   # whatever's appropriate
};

eval {…}或做{…}语法和复制$ @的原因是因为$ @是一个可以由许多不同的东西设置的全局变量。你想尽可能地以原子方式获取这个值,以避免竞争条件其他的东西设置为不同的值。

如果您在运行时不知道该模块的名称,则必须手动在模块名称(My :: Module)和文件名(My / Module.pm)之间进行翻译:

my $module = 'My::Module';

eval {
    (my $file = $module) =~ s|::|/|g;
    require $file . '.pm';
    $module->import();
    1;
} or do {
    my $error = $@;
    # ...
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读