【问题标题】:perl how to access func when the module is imported on the flyperl如何在动态导入模块时访问func
【发布时间】:2011-11-09 00:31:31
【问题描述】:

我有一个如下所示的模块:

package Test;
use strict;
use warnings;

sub hello {
    my $val = shift
    print "val = $val\n";
}

在另一个模块中,我像这样插入这个:

my $module = 'Test'
eval "require $module";

如何在第二个模块中调用函数你好/我的意思是像一个函数而不是一个方法/。

【问题讨论】:

    标签: perl function module require


    【解决方案1】:

    您可以使用符号引用:

    {
        no strict 'refs';   # disable strictures for the enclosing block
        &{ $module . '::hello' };
    }
    

    或者,您可以将函数导出到调用包(参见Exporter):

    package Test;
    use Exporter 'import';
    our @EXPORT = qw(hello);
    
    sub hello {
    ...
    }
    

    然后在你的代码中:

    my $module = 'Test'
    eval "use $module";
    hello("test");
    

    【讨论】:

    • 在最后一种情况下,eval 必须更改为 a) use 而不是 require 或 b) import 必须手动调用。至少我是这么认为的……
    【解决方案2】:

    另一种方式:

    $module->can('hello')->('test');
    

    【讨论】:

      【解决方案3】:

      您可以在此目的中使用相同的 eval:

      my $module = 'Test'
      eval "require $module";
      
      eval $module . "::hello()";
      

      您还可以访问符号表并获取所需子代码的参考:

      my $code = do { no strict 'refs'; \&{ $module . '::hello' } };
      $code->();
      

      但这看起来不太干净。

      但是,如果您需要对包名称进行类似方法的调用,则可以使用:

      $module->new();
      

      这也很有用

      【讨论】:

      • 我会在任何一天对 eval EXPR 的这种用法进行第二次 sn-p。
      猜你喜欢
      • 2020-07-21
      • 1970-01-01
      • 2015-09-19
      • 2019-12-04
      • 2017-07-13
      • 2011-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多