Perl 使用字符串执行类子例程
我正在使用一组共享同一界面的软件包。我需要在不同的类名上执行相同的子例程,并希望使其成为动态的,例如,在本例中:Perl 使用字符串执行类子例程,perl,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}; 我需要准确地调用子例程,而不是类的方法。我怎样才能做到这一点? 当我使用
#!/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};
我需要准确地调用子例程,而不是类的方法。我怎样才能做到这一点?
当我使用参数“Mod1 some_sub”从CLI执行上面的脚本时,我收到脚本执行错误,并显示下一条消息:
Bad name after :: at ./test.pl line 13.
或
最后两行
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;
%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.
这个错误是因为我没有按预期调用函数,但关键是我设法调用了函数
%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.
错误是由于我没有按预期调用函数,但关键是我设法调用了该函数。您似乎在寻找。使用
eval
可以将任意字符串作为Perl代码执行。不使用eval是否可能?@PerlDog这将非常危险,因为OP正在接受来自命令行的参数。调度表(可能还有自动加载)会更好。@ThisSuitesBlack不是很好的观点;我没想过。我专注于如何运行任意代码。我目前正在写一个答案。如果我张贴,我会考虑的。看你似乎在寻找。使用eval
可以将任意字符串作为Perl代码执行。不使用eval是否可能?@PerlDog这将非常危险,因为OP正在接受来自命令行的参数。调度表(可能还有自动加载)会更好。@ThisSuitesBlack不是很好的观点;我没想过。我专注于如何运行任意代码。我目前正在写一个答案。如果我发布它,我会考虑。看看酷方法,但这是一个示例脚本,我不能把它应用到一个真正的代码中。你能帮忙吗?我在LendingClub包中有这样一行代码:$nmzed->$field($Wrapper::LendingClub::{${nmz}::“}{from_string}($lc->{$lc_field}))代码>并且它无法执行,消息是“不能在lib/Wrapper/LendingClub.pm第140行使用未定义的值作为子例程引用。”$nmz包含正确的包名。我有一个想法,感谢Scool方法,但这是一个示例脚本,我无法在实际代码中应用它。你能帮忙吗?我在LendingClub包中有这样一行代码:$nmzed->$field($Wrapper::LendingClub::{${nmz}::“}{from_string}($lc->{$lc_field}))代码>并且它无法执行,消息为“不能在lib/Wrapper/LendingClub.pm第140行使用未定义的值作为子例程引用。”$nmz包含正确的包名。我有一个主意,谢谢
% 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.