gpt4 book ai didi

perl - 自动调用作为子程序引用的哈希值

转载 作者:行者123 更新时间:2023-12-03 18:25:40 24 4
gpt4 key购买 nike

我有一个散列,其中有几个值不是标量数据,而是返回标量数据的匿名子例程。我想让这对在散列中查找值的代码部分完全透明,这样它就不必知道某些散列值可能是返回标量数据的匿名子例程,而不仅仅是普通的旧例程标量数据。

为此,有没有办法让匿名子例程在访问它们的键时执行,而不使用任何特殊语法?这是一个说明目标和问题的简化示例:

#!/usr/bin/perl

my %hash = (
key1 => "value1",
key2 => sub {
return "value2"; # In the real code, this value can differ
},
);

foreach my $key (sort keys %hash) {
print $hash{$key} . "\n";
}

我想要的输出是:
perl ./test.pl
value1
value2

相反,这就是我得到的:
perl ./test.pl
value1
CODE(0x7fb30282cfe0)

最佳答案

As noted by Oleg ,可以使用各种或多或少的神秘技巧来做到这一点,例如 tie , 重载或魔法变量。然而,这将是不必要的复杂和毫无意义的混淆。尽管这些技巧很酷,但在实际代码中使用它们至少在 99% 的情况下都是错误的。

在实践中,最简单和最干净的解决方案可能是编写一个辅助子例程,它接受一个标量,如果是代码引用,则执行它并返回结果:

sub evaluate {
my $val = shift;
return $val->() if ref($val) eq 'CODE';
return $val; # otherwise
}

use it like this :
foreach my $key (sort keys %hash) {
print evaluate($hash{$key}) . "\n";
}

关于perl - 自动调用作为子程序引用的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061561/

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