2012-06-11 8 views
5

Poniższy kod działa poprawnie z Active Perl 5.14.2:Perl problem niezgodność ze sobą w hash mieszań - 5,14 → 5.8.8

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()); 
    } 
} 

Teraz, gdy próbuję użyć tego kodu na RedHat 5.3 z Perl 5.8.8, mam następujący błąd:

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. 

Pytanie: Jak mogę naprawić ten błąd? Jak mam przemierzać mój hashtable?

+13

Perl 5.7 jest wersją * starszą * ** rozwojową **. Nie używaj go. – Quentin

+2

Red Hat 5.3 został dostarczony z Perl 5.8.8 w standardzie (patrz http://vault.centos.org/5.3/os/i386/CentOS/). Jeśli używasz wersji 5.7, oznacza to, że ktoś obniżył twoją wersję Perla do wersji rozwojowej (czyli niestabilnej) Perla. Naprawdę, nie używaj tego do żadnej poważnej pracy. –

+0

Powiedział, że używa 5.8.8 w poście. Podmiot musi być literówką. Naprawiony. – ikegami

Odpowiedz

17

Co powiedział Quentin, ale można spróbować wymienić

each($hzones{ $k1 }) 

z

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

który dereferences ref hash.

+9

Obsługa automatycznego derefencjowania hashrefów została [dodana w Perlu 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements). – Quentin

3

Możliwość przekazania odniesienia do each (each($hzones{ $k1 })) była introduced w 5.14.0. Wcześniej trzeba było podać skrót (each(%{ $hzones{ $k1 })). To nadal działa i nadal będzie działać.

Tak więc, aby być kompatybilny wstecz, użyj

each(%{ $hzones{ $k1 }) 

zamiast

each($hzones{ $k1 }) 

Uwaga: Podanie odniesienie do each jest oznaczone jako eksperymentalne, i uważam, że buggy, ponieważ nie robi pracować ze wszystkimi hashe.

+0

Jeśli eksperymentalne jest podanie odniesienia do "każdego", jaka byłaby najlepsza alternatywa do użycia bez "każdego"? – Yohann

+0

@ Yoann, Jedyną alternatywą (przy jednoczesnym użyciu 'each') jest przekazanie skrótu, jak pokazano. – ikegami

+0

Byłem bardzo podekscytowany, a teraz zgadzam się, jest zbyt wiele przypadków nieparzystych. Próbuję go nigdy nie używać. Niestety, przypadkowo zapomniałem o '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' No cóż, łatwo zaradzić, ale lekcja się nauczyła. –

Powiązane problemy