代码之家  ›  专栏  ›  技术社区  ›  Miroslav Popov

如何调用perl闭包通过引用返回的sub?

  •  1
  • Miroslav Popov  · 技术社区  · 7 年前

    我试图使子例程闭包像对象一样工作。 但是,我无法正确调用返回的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 回复  |  直到 7 年前
        1
  •  2
  •   Grinnz    7 年前

    如中所述 perlref , the sub 不带名称的关键字创建匿名子例程并返回对它的引用。因此,不需要使用反斜杠创建另一级引用;只需将已具有的引用作为哈希中的值传递。