修复嵌套散列上存在调用时 spring 存在的键

Fixing keys that spring into existence when calling exist on a nested hash

亲爱的 Whosebugers,

当在散列上调用 exist 以测试嵌套在不存在的散列中的键是否存在时,它将创建导致最终测试的键,以查看最终键是否存在。

来自 perldoc 的例子是这样的:

undef $ref;
if (exists $ref->{"Some key"}) {}
print $ref;  # prints HASH(0x80d3d5c)

我非常喜欢 perl 的自动更新功能;但是,我现在绝对害怕将 exists 用于我可能拥有的任何未来项目。

有谁知道 and/or 如何编辑 perl 使用的库,或者是否可以使用一个模块来纠正这个问题?真的很傻,如果它不存在,它会让人看看未来的密钥是否存在。

最后,从 Checking for existence of hash key creates key 中的以下问题中学习,其中一条评论指出建议使用面向深层嵌套哈希的 OO 样式。深度嵌套 (>n=10) 和高内存 (>8GB) 以及存储在这些嵌套哈希中的非常简单的浮动值是否会存在任何技术问题?或者只是像这样的问题?

尝试:perldoc -q multilevel

http://perldoc.perl.org/perlfaq4.html#How-can-I-check-if-a-key-exists-in-a-multilevel-hash%3F

取消引用未定义的变量[1] 是导致自动生成[2] 的原因。解引用示例:

  • $ref->{key}${$ref}{key}
  • $ref->[0]${$ref}[0]
  • $$ref
  • @$ref
  • 等等

你可以通过替换

来避免它
exists( $ref->{"Some key"} )

$ref && exists( $ref->{"Some key"} )

或添加

no autovivification;

  1. 在某些情况下。

  2. "Autovivification"也可以用来指创建不存在的变量($x = 1;)、哈希元素(my %h; $h{$key} = 1;)和数组(my @a; $a[3] = 1;)。此 post 未解决这些问题,因为它与此处无关。

你应该添加

no autovivification;

到模块的顶部。这将防止自动生成创建结构到您的测试点。