是否可以创建返回函数的关联数组? 与此相似的东西
%a = ('first' => sub first { $x = @_; sprintf("(first %s)", $x); });
谢谢
答案 0 :(得分:6)
可能,但您可能需要my ($x) = @_;
而不是$x = @_;
和丢弃函数名称,因为您正在处理匿名函数。
然后,您可以将功能调用为$a{first}->([arg])
my %a = ('first' => sub { my ($x) = @_; sprintf("(first %s)", $x); });
答案 1 :(得分:5)
如此接近......你错过的一个细节就是你在那里定义了一个匿名子,所以你不应该给它一个名字:
$ perl -E '%a = (first => sub { $x = @_; sprintf("(first %s)", $x); }); say $a{first}->(3);'
(first 1)
(请注意,对于$x = @_
,您将$x
设置为@_
中的项目数,而不是数组中的第一项,这就是输出为“前1“而不是”前3“。)
答案 2 :(得分:2)
您要么存储对匿名子例程的引用:
my %a = ('first' => sub { my ($x) = @_; sprintf("(first %s)", $x); });
或者对命名子例程的引用:
sub first {
my ($x)= @_;
sprintf("(first %s)", $x);
}
my %a = ('first' => \&first);
在这两种情况下,你都以同样的方式取消引用它们。
my @result = $a{first}->(@args);
这通常称为“调度表”。
答案 3 :(得分:0)
首先,perl中没有关联数组。这是一个哈希 是的,您可以在散列中存储对子例程的引用;
my %hash=(
'function'=>\&subroutine,
);
sub subroutine{
print "hai";
}
或者您可以在哈希
中创建它