Perl不兼容问题与哈希散列中的每个哈希 - 5.14→5.8.8

时间:2012-06-11 11:48:25

标签: perl

以下代码适用于Active Perl 5.14.2:

my %hzones = ();
#%hzones= (
#    'zone1' =>  {
#                  'ns1' => 'ip1',
#                  'ns1' => 'ip2',
#                  },
#    'zone2' =>  {
#                  'ns1' => 'ip1',
#                  'ns2' => 'ip2'
#                  }
#);

foreach my $k1 ( keys %hzones ) {
    debug("# $k1",$d); 
    while ( my ($key, $value) = each($hzones{ $k1 }) ) { # Problem is here   217 
        while ( my ($nsname, $nsip) = each(%$value) ) { 
            debug("## $nsname , $nsip",$d);
    }
    # Creation de la zone et ajout dans infoblox
    $session->add(createZone($k1)) or error("Add zone for ".$k1." failed: ", 
        $session->status_code(). ":" .$session->status_detail());
    }
}

现在,如果我尝试在RedHat 5.3上使用Perl 5.8.8使用此代码,则会出现以下错误:

Type of arg 1 to each must be hash (not hash element) at
  ./migration-arpa.pl line 217, near "}) "
Execution of ./migration-arpa.pl aborted due to compilation
  errors.

问题:如何修复此错误?如何遍历哈希表?

2 个答案:

答案 0 :(得分:17)

Quentin说了什么,但你可以尝试替换

each($hzones{ $k1 })

each(%{$hzones{ $k1 }})

取消引用哈希引用。

答案 1 :(得分:3)

在5.14.0中,传递对eacheach($hzones{ $k1 }))的引用的能力为introduced。在此之前,必须传递散列(each(%{ $hzones{ $k1 }))。这仍然有效,并将继续有效。

因此,为了向后兼容,请使用

each(%{ $hzones{ $k1 })

而不是

each($hzones{ $k1 })

注意:传递对each的引用被标记为实验性的,我认为它有问题,因为它不适用于所有哈希值。