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

在perl中返回函数的关联数组,perl,hash,associative-array,Perl,Hash,Associative Array,是否可以创建返回函数的关联数组? 类似的东西 %a = ('first' => sub first { $x = @_; sprintf("(first %s)", $x); }); 谢谢这是可能的,但您可能想要my($x)=@而不是$x=@和删除函数名 然后可以调用函数作为$a{first}->([arg]) 如此接近。。。您遗漏的一个细节是,您在此处定义了一个匿名sub,因此不应该给它命名: $ perl -E '%a = (first => sub { $x = @_; sp

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

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

谢谢

这是可能的,但您可能想要
my($x)=@而不是
$x=@删除函数名

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


如此接近。。。您遗漏的一个细节是,您在此处定义了一个匿名sub,因此不应该给它命名:

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

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

您可以存储对匿名子例程的引用:

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

my %a = ('first' => \&first);
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);

这通常称为“分派表”。

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

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

或者你可以在散列中创建它

$a{first}->([arg])
应该是ie.
$a{first}->(3)
我的意思是这一行我得到了编译器错误
%a=('first'=>次第一个{$x=@;sprintf((第一个%s)”,$x);})
您需要删除函数名,只需使用sub{..}
perldoc-perldata:Perl有三种内置数据类型:标量、标量数组和标量关联数组,称为“哈希”。