在perl中返回一个懒惰计算的标量

前端之家收集整理的这篇文章主要介绍了在perl中返回一个懒惰计算的标量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用绑定标量为我们的代码添加一些功能.

我们有一个指定返回标量的函数.我想我可以通过在返回它们之前绑定这些标量来为系统添加一些功能,但看起来就像在返回之前调用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";
}

猜你在找的Perl相关文章