考虑在词法闭包中创建共享变量$aa
和$bb
变量以生成新的 cob 哈希。
sub make_cob {
my($aa,$bb) = (0, 0);
{ a => \$aa,
b => \$bb,
z => sub { $aa + $bb + 1 },
};
}
变量名称$aa
并避免在perlvar 文档$bb
中出现警告,以防您需要在以下位置执行任何排序:$a
$b
make_cob
使用一个作为普通哈希%cob
看起来像
my %cob = %{ make_cob() };
${$cob{a}} = 10;
${$cob{b}} = 20;
print "z: ", $cob{z}(), "\n";
作为哈希参考$cob
,代码是
my $cob = make_cob;
${$cob->{a}} = 30;
${$cob->{b}} = 40;
print "z: ", $cob->{z}(), "\n";
您可以将它们全部包装在匿名潜艇中,如
sub make_cob {
my($aa,$bb) = (0, 0);
{ a => sub { if (@_) { $aa = shift } else { $aa } },
b => sub { if (@_) { $bb = shift } else { $bb } },
z => sub { $aa + $bb + 1 },
};
}
my $cob = make_cob;
$cob->{a}(40);
$cob->{b}(50);
print "a: ", $cob->{a}(), "\n",
"b: ", $cob->{b}(), "\n",
"z: ", $cob->{z}(), "\n";
但是,如果您要解决所有这些麻烦,请将您的 cob 实例化为 Cob 类。
package Cob;
use strict;
use warnings;
sub new {
my($class,$aa,$bb) = @_;
$_ = defined $_ ? $_ : 0 for $aa, $bb;
bless { a => $aa, b => $bb } => $class;
}
sub a { $_[0]->{a} }
sub b { $_[0]->{b} }
sub z { $_[0]->a + $_[0]->b + 1 }
1;
练习这门课
#! /usr/bin/env perl
use strict;
use warnings;
use Cob;
my $cob = Cob->new(1,2);
print "a: ", $cob->a, "\n",
"b: ", $cob->b, "\n",
"z: ", $cob->z, "\n";
输出:
一个:1
乙:2
z: 4