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

0xD*_*EEF 2 perl load module dynamic package

Stackoverflow上研究了Perl 需要的文档和其他类似的链接后,我仍然没有更聪明,必须错过一个相当简单的技巧.我在运行时加载一个模块并在其中调用子程序.问题是我不一定知道导出的子例程的名称,但必须有一个并且它被导出.

模块都看起来像这样,即.他们粗略地遵循从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
}
Run Code Online (Sandbox Code Playgroud)

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

use Module::Load;

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

load $package;
# Call the subroutine
my $hashref = $package->$subr;
Run Code Online (Sandbox Code Playgroud)

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

Axe*_*man 6

  • @EXPORT应该包含名称而不是符号.
  • 在函数名称之前不需要&符号,它是非标准的.
  • 记住要1在模块结束时返回.
  • 如果要检查包可以执行的操作,请使用can.

    die 'Auto-import sub was not named "TestSubSomeUnknownName"' 
        unless  $package->can( 'TestSubSomeUnknownName' )
        ;
    $package->TestSubSomeUnknownName(); 
    
    Run Code Online (Sandbox Code Playgroud)