如何遍历Perl中的函数列表?

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不是函数对象而是字符串

Jam*_*son 9

不是将函数的名称存储在数组中,而是将它们存储在散列中,以便您可以按名称引用它们.这是一个简单的代码示例:

#!/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问题:

我应该如何利用Perl?

  • +1用于链接大写问题.如果你认为Perl是PERL,你的业力将是如此糟糕,以至于没有任何因素可行. (3认同)