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

标签 perl data-structures hash anonymous-function

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

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

#!/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/

相关文章:

jquery - 在另一个页面上加载 div 的内容

perl - SUPER 伪类是如何在 perl 中解析的?

python - 如何在 perl 或 python 中搜索文件中某个范围内的所有位置?

algorithm - Big-O 和缓存感知数据结构和算法

java - 我应该为高效方法选择高时间复杂度数据结构还是高空间复杂度数据结构?

php - 通过 HTTPS 发布表单值

perl - 交叉编译Perl for ARM

python - 如何在 Python 中用 ascii 字符替换 unicode 字符(给定的 perl 脚本)?

c - 使用 C 的链接列表中的段错误(核心转储)

php - 最佳实践/如何保护根目录以上的文件并对链接进行哈希处理以在受限登录帐户区域中向客户显示?