gpt4 book ai didi

perl - 检查子例程在 Perl 中是否被用作左值或右值

转载 作者:行者123 更新时间:2023-12-04 07:19:36 25 4
gpt4 key购买 nike

我正在编写一些代码,其中我使用子例程作为左值和右值来读取和写入数据库值。问题是,我希望它根据它是用作左值还是右值做出不同的 react 。

我希望子例程在用作左值时写入数据库,并在用作右值时从数据库中读取。

例子:

# Write some data
$database->record_name($subscript) = $value;

# Read some data
my $value = $database->record_name($subscript);

我能想到的唯一方法是找到一种方法让子例程识别它是用作左值还是右值,并针对每种情况做出不同的 react 。

有没有办法做到这一点?

最佳答案

决定如何处理它是否被称为左值是一个坏主意,因为 foo(record_name(...))将其称为左值。

相反,您应该决定如何处理它是否用作左值。

您可以通过返回 magical value 来做到这一点。 .

use Variable::Magic qw( cast wizard );

my $wiz = wizard(
data => sub { shift; \@_ },
get => sub { my ($ref, $args) = @_; $$ref = get_record_name(@$args); },
set => sub { my ($ref, $args) = @_; set_record_name(@$args, $$ref); },
);

sub record_name :lvalue {
cast(my $rv, $wiz, @_);
return $rv;
}

一个小测试:
use Data::Dumper;

sub get_record_name { print("get: @_\n"); return "val"; }
sub set_record_name { print("set: @_\n"); }

my $x = record_name("abc", "def"); # Called as rvalue

record_name("abc", "def") = "xyz"; # Called as lvalue. Used as lvalue.

my $y_ref = \record_name("abc", "def"); # Called as lvalue.
my $y = $$y_ref; # Used as rvalue.
$$y_ref = "xyz"; # Used as lvalue.

输出:
get: abc def
set: abc def xyz
get: abc def
set: abc def xyz

看到这个之后,你肯定知道你应该放弃使用左值子的想法。可以隐藏所有复杂性(例如通过使用 sentinel ),但复杂性仍然存在。花哨并不值得所有的复杂性。使用单独的 setter 和 getter 或使用其角色基于传递给它的参数数量的访问器( $s=acc();acc($s) )。

关于perl - 检查子例程在 Perl 中是否被用作左值或右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35183963/

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