gpt4 book ai didi

perl - 在 perl 中返回一个延迟计算的标量

转载 作者:行者123 更新时间:2023-12-04 23:09:48 24 4
gpt4 key购买 nike

我正在尝试通过使用绑定(bind)标量向我们的代码库添加一些功能。

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

有没有办法解决?

如果可能的话,我真的想保持子例程的接口(interface)(返回标量)完好无损。

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

我可以通过返回一个引用并在每次访问时取消引用来获得所需的输出,但这会破坏我们已建立的界面,并使我们的用户更加困惑。

——巴克

最佳答案

正如 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 中返回一个延迟计算的标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com