我有一个哈希值,其中一些值不是标量数据,而是返回标量数据的匿名子例程。我想让这对在哈希中查找值的代码部分完全透明,这样它就不必知道某些哈希值可能是返回标量数据的匿名子例程,而不仅仅是普通的旧值标量数据。
为此,有没有办法让匿名子例程在访问其键时执行,而不使用任何特殊语法?这是一个说明目标和问题的简化示例:
#!/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)
正如奥列格所指出的,可以使用各种或多或少神秘的技巧来做到这一点,例如tie
、重载或魔法变量。然而,这会变得不必要的复杂和毫无意义的混淆。尽管这些技巧很酷,但在实际代码中使用它们至少在 99% 的情况下都是错误的。
在实践中,最简单、最干净的解决方案可能是编写一个辅助子例程,它接受一个标量,如果它是代码引用,则执行它并返回结果:
sub evaluate {
my $val = shift;
return $val->() if ref($val) eq 'CODE';
return $val; # otherwise
}
and 像这样使用它:
foreach my $key (sort keys %hash) {
print evaluate($hash{$key}) . "\n";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)