使用string执行class子例程

时间:2016-03-24 17:34:45

标签: perl

我使用了一堆共享相同接口的软件包。我需要在不同的类名上执行相同的子程序,并希望使其成为动态的,就像这个例子中的那样:

#!/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;

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.

错误是由于我没有按照预期调用函数,但重点是我设法调用函数。