Wie erhalte ich eine Hash-Scheibe aus einem Hash von Hashes?
-
21-09-2019 - |
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
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