我正在尝试使用绑定标量为我们的代码库添加一些功能.
我们有一个指定返回标量的函数.我想我可以通过在返回它们之前绑定这些标量来为系统添加一些功能,但看起来就像在返回之前调用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
我可以通过返回引用来获得所需的输出,并在每次访问时取消引用,但这会破坏我们已建立的界面,并使我们的用户更加困惑.
–Buck
解决方法
正如DVK所说,tie适用于容器,因此对返回值没有用.
为此,您使用重载.示例(并非提供所有可能的重载操作;请参阅http://perldoc.perl.org/overload.html#Minimal-set-of-overloaded-operations):
use strict; use warnings; main(); sub GetThing{ my $thing; $thing = "mything"->new(@_); 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; use overload 'fallback' => 1,'""' => 'FETCH'; sub new { my $class = shift; bless { name => shift || 'noname',$class; } sub FETCH { my $self = shift; print "ACCESS ALERT!\n"; return " NAME: '$self->{name}'\n"; }