Perl的哈希重新声明散列哈希值?

时间:2015-04-09 22:50:00

标签: perl hash

假设我有一个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 

1 个答案:

答案 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} ) ) {