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

How can I force and error on an undefined hash key?

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

我假设在过去 10 年中 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 或涉及访问器方法的东西。

原因如下:我想调试和开发时开启,否则关闭。程序和电脑已经够慢了。

欢迎任何固定代码(参见上面的 link)或其他解决方案。

这是为 x86_64-Linux-thread-multi

构建的 Perl 5,版本 16,Subversion 3 (v5.16.3)

对于不存在的哈希键,它不同于存在但具有未定义值的哈希键,您可以使用lock_hash from Hash::Util .请注意,它还限制更改任何值。不幸的是 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 用于 read-only 哈希的底层机制相同,但它有点令人困惑,因为它试图同时充当 read-only(现有值不能被更改)和限制(无法访问不存在的密钥)。