Frage

Ich habe einen Hash wie folgt:

my %h = ( a => { one => 1,
                 two => 2
             },
          b => { three => 3,
                 four => 4
             },
          c => { five => 5,
                 six => 6
             }
      );

print join(',', @{$h{a}{qw/one two/}});

Der Fehler I get ist: Kann nicht einen nicht definierten Wert als ARRAY Bezug auf q.pl Linie 17 benutzen das ist die Linie mit dem Druck.

Was ich erwartet ist 1,2

War es hilfreich?

Lösung

Um einen Hash-Slice von einer verschachtelten Hash zu erhalten, müssen Sie de-reference in den Schritten. Sie erhalten die erste Ebene, die Sie brauchen:

$h{'a'}

Nun haben Sie zu dereferenzieren, dass als Hash. Allerdings ist es da nicht ein einfacher skalar, müssen Sie es in Klammern setzen. Um den gesamten Hash zu bekommen, werden Sie einen % vor den Klammern gesetzt:

%{ $h{'a'} }

Nun wollen Sie ein Stück, so dass Sie die % mit einem @ ersetzen, da Sie mehrere Elemente, und du auch deine Schlüssel am Ende als normal setzen:

@{ $h{'a'} }{ @keys }

Es könnte einfacher suchen, um die Klammern einzeln zu sehen:

@{         }{       }
   $h{'a'}    @keys

Um dies einfacher zu machen, V5.20 die postfix dereferenzieren . Statt dem, was die Verpackung in Klammern und die Arbeit von innen nach außen, können Sie von links nach rechts arbeiten:

$h{a}->@{qw/one two/};

Das @ ist die gleiche Sache, die Sie vor der ersten Klammer sahen. Sie wissen, dass es immer noch ein Hash-Slice, weil eine Klammer die Sigill folgt.

Andere Tipps

Versuch

print join(',',@{$h{'a'}}{qw/one two/});

Verwendung von Data :: Dumper hilft sehr in Fällen wie diesen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top