在Perl中生成函数引用数组

时间:2014-04-30 10:19:37

标签: perl

我有很多以给定前缀开头的函数。我想创建一个这些函数的数组,然后逐个执行它们。

考虑:

use v5.12;

my @names = qw(a b);
my @ss = map { "s".$_ } @names;

sub sa {
    say "a";
}

sub sb {
    say "b";
}

此处函数前缀为s。如何逐个调用这些函数,例如,使用for循环...? (我尝试在\&命令中插入map,但这不起作用。)

请注意,所有功能都将使用相同的参数,这就是为什么我认为这可能有用的原因...

2 个答案:

答案 0 :(得分:4)

一种可能的方法:

use 5.012;

my @names = qw(a b);
my @ss    = map { \&{"s$_"} } @names;

sub sa {
    say "a";
}

sub sb {
    say "b";
}

&$_() for @ss;

Demo。简而言之,存储对函数的引用。请注意,在@ss中存储子例程名称并调用它们(使用& sygil)会在严格模式下失败:

  

不能使用字符串(" sa")作为子例程参考,而严格参考"

而且,也许它只是我,但我宁愿用哈希定义这些函数:

my %hof = (
  a => sub { say 'a'; },
  b => sub { say 'b'; },
  c => sub { say 'c: ' . $_[0]; },
);

$hof{$_}('something') for sort keys %hof;

<强>输出

a
b
c: something

答案 1 :(得分:2)

use strict;
use warnings;
use v5.12;

use Data::Dumper;

my @names = qw(a b);
my @ss = map { $main::{"s$_"} } @names;

$_->() for @ss;


sub sa {
    say "a";
}

sub sb {
    say "b";
}