我使用了一堆共享相同接口的软件包。我需要在不同的类名上执行相同的子程序,并希望使其成为动态的,就像这个例子中的那样:
#!/usr/bin/env perl
use Modern::Perl;
use Data::Dumper;
use Mod1;
use Mod2;
my $mod = $ARGV[0];
my $meth = $ARGV[1];
${mod}::some_sub;
${mod}::${meth};
我需要完全调用子程序,而不是一个类'方法。我怎么能做到这一点? 当我从CLI使用参数' Mod1 some_sub'执行上面的脚本时。我在下一条消息中遇到了脚本执行错误:
Bad name after :: at ./test.pl line 13.
或
Bareword found where operator expected at ./test.pl line 12, near "${mod}::some_sub"
(Missing operator before ::some_sub?)
syntax error at ./test.pl line 12, near "${mod}::some_sub"
Execution of ./test.pl aborted due to compilation errors.
最后2行
Mod1.pm看起来像这样:
package Mod1;
use Modern::Perl;
use Data::Dumper;
sub some_sub {
say Dumper(\@_);
say 'in some_meth';
}
1;
接下来是Mod2.pm代码:
package Mod2;
use Modern::Perl;
use Data::Dumper;
sub other_meth {
say Dumper(\@_);
say 'other';
}
1;
答案 0 :(得分:0)
$main::{"${mod}::"}{some_sub}();
$main::{"${mod}::"}{$meth}();
%Mod1 ::是一个顶级哈希,但也是%main ::中的一个键/值,所以我们只需要组成键并索引哈希值。不需要eval()
。
修改强>
我尝试了一个深度嵌套的包示例,同样的基本想法似乎也有效:
% perl
use ExtUtils::CBuilder::Platform::darwin;
$nmz = 'darwin';
$ExtUtils::CBuilder::Platform::{"${nmz}::"}{compile}();
Can't call method "SUPER::compile" on unblessed reference at /System/Library/Perl/5.16/ExtUtils/CBuilder/Platform/darwin.pm line 18.
错误是由于我没有按照预期调用函数,但重点是我设法调用函数。