如何在Perl中迭代/取消引用子例程引用数组?

时间:2009-01-17 00:19:21

标签: perl function iterator

我正在试图弄清楚如何迭代子例程引用数组。

这种语法出了什么问题?

use strict;
use warnings;

sub yell { print "Ahh!\n"; }
sub kick { print "Boot!\n"; }
sub scream { print "Eeek!\n"; }

my @routines = (\&yell, \&kick, \&scream);
foreach my $routine_ref (@routines) {
  my &routine = &{$routine_ref};
  &routine;
}

提前致谢!

3 个答案:

答案 0 :(得分:10)

foreach循环中,以下是语法错误:

my &routine;

你的变量$routine_ref已经有了对子程序的引用,所以你需要做的就是调用它:

for my $routine_ref (@routines) {
    &{$routine_ref};
}

与Perl一样,“有多种方法可以做到这一点。”例如,如果这些子例程中的任何一个采用了参数,您可以在括号内传递它们:

for my $routine_ref (@routines) {
  $routine_ref->();
}

另请注意,我使用for代替foreach,这是Damian Conway in Perl Best Practices提出的最佳实践。

答案 1 :(得分:4)

foreach my $routine_ref (@routines) {
        $routine_ref->();
}

答案 2 :(得分:0)

试试这个:

use strict;
use warnings;

sub yell { print "Ahh!\n"; }
sub kick { print "Boot!\n"; }
sub scream { print "Eeek!\n"; }

my @routines = (\&yell, \&kick, \&scream);
foreach my $routine_ref (@routines) {
  &$routine_ref ();
}