假设我有一个Hash of Hash of Hash(%hash)并带有一些值
warn Dumper \%hash;
'Key1'=> {'Subkey1'} => {'SubSubkey11'} => {'Value1'}
'Key2'=> {'Subkey2'} => {'SubSubkey22'} => {'Value2'}
...
然后,想要验证某个键的某些组合是否不存在(假设在$ val1和$ val2的一系列组合上有一个for if循环)。
if (!exists $hash{$val1}{$val2} ) { #### I am only verifying the existent of the Key and Subkey, not SubSubkey
print "Doesn't exists";
}
如果我在循环结束后使用,我会看到类似的东西:
warn Dumper\%hash;
'Key1' => {'Subkey1'} => {}
'Key2' => {'Subkey2'} => {}
'Key1'和'Subkey1'以某种方式“分配”到void值,因为我可能会在不存在的键的相同组合上循环几次,在第一次循环通过一对键后第二次如果需要这种结合是存在的。
导致这种情况的原因是解决问题的最佳方法。我尝试在if中取消引用哈希并得到此错误
exists argument is not a HASH or ARRAY element or a subroutine
答案 0 :(得分:3)
这是因为您将$hash{$var1}
视为哈希引用,因此它会自动变为一个;这称为autovivification,非常方便。
您可以通过安装和使用autovivification pragma来禁用它:
if ( do { no autovivification; ! exists $hash{$var1}{$var2} } ) {
或者您可以手动执行基本相同的操作:
if ( ! exists ${ $hash{$var1} || {} }{$var2} ) {
(这里,如果未设置$hash{$var1}
,我们不会将其用作哈希引用,而是使用空哈希。)
或者,如果你看起来更具可读性,你可以这样做:
if ( ! ( $hash{$var1} && exists $hash{$var1}{$var2} ) ) {