微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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";
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐