Perl:动态加载模块并访问导出的内容

标签 perl dynamic module load package

学完 Perl require docsStackoverflow 上的其他类似链接我仍然没有更聪明,一定是错过了一个相当简单的技巧。我在运行时加载一个模块并在其中调用一个子例程。问题是我不一定知道导出的子程序的名字,但一定有,而且是导出的。

模块都看起来像这样,即。他们大致遵循取自 perlmonks.org 的模板

package modules::Test;

use strict;
use Exporter;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);

$VERSION     = 1.00;
@ISA         = qw(Exporter);
@EXPORT      = (*TestSubSomeUnknownName);
@EXPORT_OK   = qw(&TestSubSomeUnknownName);
%EXPORT_TAGS = ( ALL => [qw(&TestSubSomeUnknownName)]
               );


sub TestSubSomeUnknownName
{
    # return a hash reference
}

然后我可以像这样访问子,假设我知道它的名字:
use Module::Load;

my $package = "modules::Test";
my $subr = "TestSubSomeUnknownName";

load $package;
# Call the subroutine
my $hashref = $package->$subr;

但是如果有人在包裹中拼错了名字或者我不知道怎么办?解决方案似乎是使用其中一个 EXPORT 来查看其中的内容,但怎么做呢?

最佳答案

  • @EXPORT应该包含名称而不是符号。
  • 您不需要函数名称之前的&符号,它是非标准的。
  • 记得返回 1在模块的末尾。
  • 如果你想检查一个包可以做什么,使用 can .
    die 'Auto-import sub was not named "TestSubSomeUnknownName"' 
        unless  $package->can( 'TestSubSomeUnknownName' )
        ;
    $package->TestSubSomeUnknownName(); 
    
  • 关于Perl:动态加载模块并访问导出的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8487067/

    相关文章:

    jboss as7 tld 未找到

    selenium - 如何在 Perl 中使用 selenium 验证网站是否发送 2XX 响应?

    perl - 在 Perl 中,如何将 unicode 参数传递给外部命令?

    perl - Perl 中的 new Some::Class 和 Some::Class->new() 有什么区别?

    c++ - dos.h 是一个什么样的库(静态的还是动态的)?

    dynamic - 为永恒而爬行

    Perl - Spreadsheet::WriteExcel 函数解释

    perl - my 的词法范围

    java - 如何动态创建多个 JSON 对象?

    python - 假设解密 key 被很好地隐藏,如何加密 python 模块