我正在尝试使子例程关闭像对象一样工作。 但是,我无法正确调用返回的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
答案 0 :(得分:2)
如perlref中所述,没有名称的sub
关键字会创建一个匿名子例程并返回对其的引用。因此,您无需使用反斜杠创建另一个参考级别;只需将您已有的引用作为哈希值即可。