修复调用时存在的键存在于嵌套哈希中

时间:2016-05-21 19:00:03

标签: perl hash key exists

亲爱的Stackoverflowers,

当调用存在于散列上以测试密钥的存在时,进一步嵌套在不存在的散列中,它将创建密钥,导致最终测试以查看最终密钥是否存在。

来自perldoc的例子就是:

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

我非常喜欢perl的自动化功能;但是,我现在绝对害怕将任何未来的项目用于存在。

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

最后,在Checking for existence of hash key creates key中学习下面的问题,其中一条评论指出了针对深度嵌套哈希的OO风格。深度嵌套(> n = 10)和高内存(> 8GB)是否存在任何技术问题,这些嵌套哈希中存储了非常简单的浮点值?或者只是这样的问题?

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

取消引用未定义的变量 [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. "&自动激活#34;也可用于引用不存在的变量($x = 1;),哈希元素(my %h; $h{$key} = 1;)和数组元素(my @a; $a[3] = 1;)的创建。这篇文章没有解决这些问题,因为它与此无关。

答案 2 :(得分:1)

你应该添加

no autovivification;

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