如何调用Perl闭包通过引用返回的子项?

时间:2019-07-18 22:07:12

标签: perl closures

我正在尝试使子例程关闭像对象一样工作。 但是,我无法正确调用返回的subs引用。

我收到Not a CODE reference at .\closure.pl line 22.错误。

#!/usr/bin/perl
use strict;
use warnings;

sub number {
    my ($value) = @_;

    my $val = sub {   $value };
    my $inc = sub { ++$value };
    my $dec = sub { --$value };

    my %api = (
        'val' => \$val,
        'inc' => \$inc,
        'dec' => \$dec,
    );

    return %api;
}

my %numb = number(42);
$numb{'inc'}->();
print $numb{'val'}->();

如何修复代码?

固定代码

是的,当然,匿名定义必须返回引用。这意味着它可以直接放在%api中。 Perl不会抱怨,并且就像一个魅力:)

#!/usr/bin/perl
use strict;
use warnings;

sub number {
    my ($value) = @_;

    my %api = (
        'val' => sub {   $value },
        'inc' => sub { ++$value },
        'dec' => sub { --$value },
    );

    return \%api;
}

my $m = number(14);
my $n = number(41);

$m->{'dec'}->();
$n->{'inc'}->();

print $m->{'val'}->() . "\n"; # -> 13
print $n->{'val'}->() . "\n"; # -> 42

1 个答案:

答案 0 :(得分:2)

perlref中所述,没有名称的sub关键字会创建一个匿名子例程并返回对其的引用。因此,您无需使用反斜杠创建另一个参考级别;只需将您已有的引用作为哈希值即可。