在perl中返回函数的关联数组

时间:2013-05-16 12:14:58

标签: perl hash associative-array

是否可以创建返回函数的关联数组? 与此相似的东西

%a = ('first' => sub first { $x = @_; sprintf("(first %s)", $x); });

谢谢

4 个答案:

答案 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";
 }

或者您可以在哈希

中创建它