我正在尝试通过使用绑定标量向我们的代码库添加一些功能。
我们有一个指定返回标量的函数。我想我可以通过在返回它们之前绑定这些标量来为系统添加一些功能,但看起来 FETCH 方法在返回之前被调用,这导致返回一个未绑定的标量。
有没有办法解决?
如果可能的话,我真的很想保持子例程的接口(返回标量)完好无损。
use strict;
use warnings;
main();
sub GetThing{
my $thing;
tie $thing, 'mything', @_;
return $thing;
}
sub main {
my %m;
$m{pre} = GetThing('Fred');
print "1\n";
print $m{pre};
print "2\n";
print $m{pre};
print "3\n";
}
package mything;
require Tie::Scalar;
my @ISA = qw(Tie::StdScalar);
sub TIESCALAR {
my $class = shift;
bless {
name => shift || 'noname',
}, $class;
}
sub FETCH {
my $self = shift;
print "ACCESS ALERT!\n";
return " NAME: '$self->{name}'\n";
}
期望的输出:
1
ACCESS ALERT!
NAME: 'Fred'
2
ACCESS ALERT!
NAME: 'Fred'
3
我可以通过返回一个引用并在每次访问时取消引用来获得所需的输出,但这会破坏我们已建立的界面,并使我们的用户更加困惑。
——巴克