我有很多以给定前缀开头的函数。我想创建一个这些函数的数组,然后逐个执行它们。
考虑:
use v5.12;
my @names = qw(a b);
my @ss = map { "s".$_ } @names;
sub sa {
say "a";
}
sub sb {
say "b";
}
此处函数前缀为s
。如何逐个调用这些函数,例如,使用for
循环...? (我尝试在\&
命令中插入map
,但这不起作用。)
请注意,所有功能都将使用相同的参数,这就是为什么我认为这可能有用的原因...
答案 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";
}