如何在未定义的哈希键上强制和出错?

时间:2019-06-27 21:15:46

标签: perl hashmap accessor

我正在尝试使用make perl shout when trying to access undefined hash key中的代码,但是它不起作用。

我认为在过去十年中tie的工作方式已经发生了变化。

我得到的错误是:

Safe::Hash must define either a TIEHASH() or a new() method at /home/bennett/work/stock/Indicator.pm line 97.

我只需要大约所用哈希值的5%,就希望使用不会改变界面的东西(即$foo{bar})。也就是说,我不想使用Moose或涉及访问器方法的东西。

这是为什么:我想将其打开以进行调试和开发,否则将其关闭。该程序和计算机的速度足够慢。

欢迎使用任何固定的代码(请参见上面的链接)或其他解决方案。

这是为x86_64-Linux-thread-multi构建的Perl 5,版本16,Subversion 3(v5.16.3)

1 个答案:

答案 0 :(得分:2)

对于不存在哈希密钥,该密钥与存在但具有未定义值的哈希密钥不同,可以使用Hash::Util中的lock_hash。请注意,它还限制了所有值的更改。不幸的是,除非您尝试进行设置,否则lock_keys会更接近您的要求,它不会导致访问不存在的密钥时出错。

use strict;
use warnings;
use Hash::Util 'lock_hash';
my %foo = (a => 1, b => 2);
lock_hash %foo;
print $foo{c}; # error

这与Const::Fast用于只读哈希的底层机制相同,但是由于它试图同时充当只读(无法更改现有值)和受限(不存在的密钥无法访问。