首页 > 解决方案 > 如何调用 Perl 闭包通过引用返回的子对象?

问题描述

我试图让子程序闭包像一个对象一样工作。但是,我无法正确调用返回的 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

标签: perlclosures

解决方案


perlref中所讨论的,没有名称的sub关键字创建一个匿名子例程并返回对它的引用。所以你不需要使用反斜杠创建另一个级别的引用;只需将您已有的引用作为散列中的值传递。


推荐阅读