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