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

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...