biz*_*nez 4 perl loops function
我在Perl中有一个函数列表.例:
my @funcs = qw (a b c)
Run Code Online (Sandbox Code Playgroud)
现在他们都属于这个模块Foo :: Bar :: Stix.我想在循环中迭代地调用它们:
foreach $func (@funcs) {
Foo::Bar::Stix::$func->(%args)
}
Run Code Online (Sandbox Code Playgroud)
其中args是参数的哈希值.但是我不断收到这个错误:"包含Foo :: Bar :: Stix :: $ func - >(%args)的行之后的"...之后的错误名称"如何修复此错误?
ab和c不是函数对象而是字符串
不是将函数的名称存储在数组中,而是将它们存储在散列中,以便您可以按名称引用它们.这是一个简单的代码示例:
#!/usr/bin/perl
use strict;
use warnings;
my %func_refs = (
'a' => \&Foo::Bar::Stix::a,
'b' => \&Foo::Bar::Stix::b,
'c' => \&Foo::Bar::Stix::c
);
foreach my $func_ref ( values %func_refs ) {
print $func_ref->( "woohoo: " ), "\n";
}
{
package Foo::Bar::Stix;
sub a {
my $arg = shift;
return $arg . "a";
}
sub b {
my $arg = shift;
return $arg . "b";
}
sub c {
my $arg = shift;
return $arg . "c";
}
}
Run Code Online (Sandbox Code Playgroud)
如果您因某些原因而无法存储名称,请尝试以下操作:
my $package = "Foo::Bar::Stix";
my @func_names = qw/ a b c /;
foreach my $func_name (@func_names) {
my $str = &{ "$package\::$func_name" }( "woohoo: " );
print $str, "\n";
}
Run Code Online (Sandbox Code Playgroud)
但是,这在use strict下不起作用,因此我更喜欢第一种解决方案.无论你做什么,尽量避免使用eval.这是不必要的,可能只会导致你的问题.
此外,大多数使用Perl的人将其资本化为Perl而不是PERL.这是关于这个主题的Stackoverflow问题: