我们有一个指定返回标量的函数.我想我可以通过在返回它们之前绑定这些标量来为系统添加一些功能,但看起来就像在返回之前调用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";}
期望的输出:
1ACCESS ALERT! name: 'Fred'2ACCESS 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";}总结
以上是内存溢出为你收集整理的在perl中返回一个懒惰计算的标量全部内容,希望文章能够帮你解决在perl中返回一个懒惰计算的标量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)