是否可以在Perl中的哈希构造函数中定义匿名子例程?

Jer*_*que 1 perl hash coderef

是否可以在Perl中的哈希构造函数中定义匿名子例程?

我正在尝试做这样的事情:

my %array = { one   => sub { print "first $_[0]" },
              two   => sub { print "next  $_[0]" },
              three => sub { print "last  $_[0]" }};

$array{$foo}->('thing');
Run Code Online (Sandbox Code Playgroud)

但它没有用.代码似乎运行和编译,但数组中的值是空白的.如果我这样做:

my %array;

$array{'one'}   = sub { print "first $_[0]" };
$array{'two'}   = sub { print "next  $_[0]" };
$array{'three'} = sub { print "last  $_[0]" };

$array{$foo}->('thing');
Run Code Online (Sandbox Code Playgroud)

然后它似乎工作正常.所以我有一个解决方法,但它只是困扰我,我想知道是否有人知道它是否可能,如果是,那么语法是什么.

Ada*_*ire 11

看起来你正在错误地分配哈希.使用{}构造一个匿名哈希引用,您可以将其指定给标量.但是你要分配一个命名的hash(%array).

你需要分配一个标量:

my $array = { one   => sub { print "first $_[0]" },
              two   => sub { print "next  $_[0]" },
              three => sub { print "last  $_[0]" }};

$array->{$foo}->('thing');
Run Code Online (Sandbox Code Playgroud)

或者不使用anon构造函数语法:

my %array = ( one   => sub { print "first $_[0]" },
              two   => sub { print "next  $_[0]" },
              three => sub { print "last  $_[0]" });

$array{$foo}->('thing');
Run Code Online (Sandbox Code Playgroud)

  • 当然,如果我们调用变量%hash而不是%array,这甚至会更正确 (2认同)

cod*_*gic 6

那是因为在第一种情况下,你创建一个hashref而不是一个hash,你想要的是:

my $array;
$array = { one => ... }; # not %array = { .. };
...
$array->{one}->('thing');
Run Code Online (Sandbox Code Playgroud)