5

次のコードは、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.

質問: このエラーを修正するにはどうすればよいですか? ハッシュテーブルをトラバースするにはどうすればよいですか?

4

2 に答える 2

17

クエンティンが言ったことですが、置き換えてみてください

each($hzones{ $k1 })

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

ハッシュ参照を逆参照します。

于 2012-06-11T11:54:34.477 に答える
3

each( each($hzones{ $k1 }))への参照を渡す機能は、5.14.0で導入されました。それ以前は、ハッシュ ( each(%{ $hzones{ $k1 })) を渡す必要がありました。それは今でも機能しており、今後も機能し続けます。

したがって、下位互換性を保つには、次を使用します

each(%{ $hzones{ $k1 })

それ以外の

each($hzones{ $k1 })

注: への参照の受け渡しはeach実験的なものとしてマークされており、すべてのハッシュで機能するとは限らないため、バグがあると考えています。

于 2012-06-11T18:09:38.090 に答える