加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:21:39 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用绑定标量为我们的代码库添加一些功能. 我们有一个指定返回标量的函数.我想我可以通过在返回它们之前绑定这些标量来为系统添加一些功能,但看起来就像在返回之前调用FETCH方法,这会导致返回一个未标记的标量. 有没有办法解决? 如果可能的话,我
我正在尝试使用绑定标量为我们的代码库添加一些功能.

我们有一个指定返回标量的函数.我想我可以通过在返回它们之前绑定这些标量来为系统添加一些功能,但看起来就像在返回之前调用FETCH方法,这会导致返回一个未标记的标量.

有没有办法解决?

如果可能的话,我真的想保持子程序的界面(返回标量)完好无损.

use strict;
use warnings;
main();

sub GetThing{
    my $thing;
    tie $thing,'mything',@_;
    return $thing;
}

sub main {
    my %m;
    $m{pre} = GetThing('Fred');
    print "1n";
    print $m{pre};
    print "2n";
    print $m{pre};
    print "3n";
}


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 "1n";
    print $m{pre};
    print "2n";
    print $m{pre};
    print "3n";
}


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读