Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用字符串执行类子例程_Perl - Fatal编程技术网

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.