学完 Perl require docs和 Stackoverflow 上的其他类似链接我仍然没有更聪明,一定是错过了一个相当简单的技巧。我在运行时加载一个模块并在其中调用一个子例程。问题是我不一定知道导出的子程序的名字,但一定有,而且是导出的。
模块都看起来像这样,即。他们大致遵循取自 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/