perl - 如何调用 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
解决方案
如perlref中所讨论的,没有名称的sub
关键字创建一个匿名子例程并返回对它的引用。所以你不需要使用反斜杠创建另一个级别的引用;只需将您已有的引用作为散列中的值传递。
推荐阅读
- sql-server - SQL Server 如何锁定行?
- javascript - Slick Slider - 从另一个页面创建链接
- mysql - 相关表有别名时如何按关系排序
- javascript - 在汇总构建中包含特定模块
- svelte - Culori js 适用于 Svelte REPL 但不适用于本地项目
- javascript - React JS 路由:从一页中省略一些组件
- r - 在 R 中将 JSON 文件转换为可用的数据框
- python - 如何在 Mac 上从 python 解决 ssl.SSLCertVerificationError
- c++ - Qt 中是否有任何功能可以编辑 JSON 文件?
- javascript - 如何在密码保护页面上根据 PHP 服务器响应运行 JavaScript?