3

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

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

谢谢

4

4 回答 4

6

这是可能的,但在处理匿名函数时,您可能想要my ($x) = @_;代替$x = @_;删除函数名。

然后你可以调用函数$a{first}->([arg])

my %a = ('first' => sub { my ($x) = @_; sprintf("(first %s)", $x); });
于 2013-05-16T12:19:16.940 回答
5

如此接近......你错过的一个细节是你在那里定义了一个匿名子,所以你不应该给它一个名字:

$ perl -E '%a = (first => sub { $x = @_; sprintf("(first %s)", $x); }); say $a{first}->(3);'
(first 1)

(请注意,使用$x = @_,您将设置$x为 中的项目数@_,而不是数组中的第一项,这就是为什么输出是“前 1”而不是“前 3”的原因。)

于 2013-05-16T13:00:54.113 回答
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);

这通常称为“调度表”。

于 2013-05-16T13:22:14.757 回答
0

首先,perl 中没有关联数组。它是一个散列 是的,您可以在散列中存储对子例程的引用;

 my %hash=(
        'function'=>\&subroutine,
 );
 sub subroutine{
     print "hai";
 }

或者您可以在哈希中创建它

于 2013-05-17T13:25:31.977 回答