亲爱的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)是否存在任何技术问题,这些嵌套哈希中存储了非常简单的浮点值?或者只是这样的问题?
答案 0 :(得分:3)
尝试:perldoc -q multilevel
或http://perldoc.perl.org/perlfaq4.html#How-can-I-check-if-a-key-exists-in-a-multilevel-hash%3F
答案 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;
在某些情况下。
"&自动激活#34;也可用于引用不存在的变量($x = 1;
),哈希元素(my %h; $h{$key} = 1;
)和数组元素(my @a; $a[3] = 1;
)的创建。这篇文章没有解决这些问题,因为它与此无关。
答案 2 :(得分:1)
你应该添加
no autovivification;
到模块的顶部。这将阻止自动生成将结构创建到测试点。