【问题标题】:How can I force and error on an undefined hash key?如何强制和错误未定义的哈希键?
【发布时间】:2019-06-29 03:40:06
【问题描述】:

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

我认为tie 在过去 10 年的工作方式发生了一些变化。

我得到的错误是:

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)

【问题讨论】:

  • 不,tie 的工作方式“没有任何变化”。链接答案中的代码仍然有效。错误在于您的修改。你忘记加载 Tie::Hash 了吗?
  • 当。不假思索,我将require;push @ISA 更改为use parent。显然它们并不像我想象的那样“相同”。谢谢。
  • 这将使 Tie::Hash 成为父级,而不是 Tie::StdHash
  • 噢!好吧,这只是我的草率阅读。

标签: perl hashmap accessor


【解决方案1】:

对于 不存在 散列键,它不同于存在但具有未定义值的散列键,您可以使用来自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 用于只读哈希的底层机制相同,但它有点令人困惑,因为它试图同时充当只读(现有值无法更改)和受限(不存在的键)无法访问)。

【讨论】:

  • 这比使用tie 快得多(因为它不涉及调用 Perl 子程序,这对于每次访问哈希值来说相当慢)。
  • Variable::Magic 也可能比 tie 快得多,即使它仍然会涉及子调用开销。
  • 谢谢! Hash::Util 正是我所需要的。我必须调查 Variable::Magic,因为这很神奇。
  • 只是要明确一点...如果您尝试读取不应该存在的密钥,Hash::Util 会出错。由于我将其用于错字保护,因此非常完美。如果它是不是exists 的“有效”密钥,我将在程序中处理它。
  • lock_hash 可以,但 lock_keys(仍然允许更改现有值)不可以。
猜你喜欢
  • 2012-05-10
  • 2011-12-01
  • 2013-10-10
  • 2013-02-16
  • 2022-11-22
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多