Wie kann ich einem nur Teil eines hash in Perl?
Gibt es eine Möglichkeit, um eine sub-hash? Brauche ich einen hash-slice?
Beispiel:
%hash = ( a => 1, b => 2, c => 3 );
Ich will nur
%hash = ( a => 1, b => 2 );
- Da ist nichts logisch zu "slice" ich vermute, etwas zu tun mit "Karte". In einem array, das Sie es tun würde, basiert auf einem index, sondern in einem hash gibt es keine zuverlässig interne Darstellung der Daten. Man bräuchte irgendeine Art von qualifier (regex?) zu definieren, was sollte in der subhash und was nicht.
- BTW, Sie die hash-syntax ist falsch: verwenden Sie Runde Klammern "()" für eine einfache hash, "{}" für die anonyme hash-Referenzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hash-slices Rückkehr der Werte verbunden mit einer Liste von Schlüsseln. Um einen hash-slice, den Sie ändern Sie die Siegel an @ und eine Liste der Schlüssel (in diesem Fall
"a"
und"b"
):Oft Sie können verwenden Sie ein Zitat Wort-operator zum erzeugen der Liste:
Können Sie auch zuweisen, um einen hash-slice, wenn Sie so wollen, einen neuen hash enthält eine Teilmenge der anderen hash kann man sagen
Viele Menschen nutzen eine anzeigen statt hash-slices:
Beginnend mit Perl 5.20.0, erhalten Sie die Schlüssel und die Werte in einem Schritt, wenn Sie die % Siegel anstelle des @ - Siegel:
Würden Sie wahrscheinlich wollen einfach eine Liste von Schlüssel Sie möchten:
Und dann eine Schleife verwenden, um die hash:
Oder:
(Meine Vorliebe ist die zweite, aber je nachdem, was Ihnen gefällt, ist es am besten.)
Noch einen anderen Weg:
Zuviel funktionale Programmierung führt mich zu denken
zip
ersten.Mit List::MoreUtils installiert,
Leider der Prototyp List::MoreUtils ist
zip
hemmtWenn Sie wirklich wollen, um zu vermeiden, die temporäre variable, Sie könnten
Oder schreiben Sie einfach Ihre eigenen
zip
ohne das problematische Vorbild. (Dies muss nicht List::MoreUtils überhaupt.)Wenn du gehst zu sein, mutiert in-place,
vermeidet das zusätzliche kopieren, dass der
map
undzip
Lösungen entstehen. (Ja, mutiert der hash, während Sie Durchlaufen, ist es sicher... solange die mutation ist nur das löschen der zuletzt iteriert paar.)%keep = map +($_ => 1), qw(a b);
?FWIW, verwende ich Moose::Autobox hier:
Im realen Leben, ich verwende extrahieren "Benutzername" und "Passwort" aus einer Formular-Vorlage, und geben, dass die Catalyst
$c->authenticate
(die erwartet wird, in meinem Fall, eine hashref mit dem Benutzernamen und Passwort, aber sonst nichts).Neu in perl 5.20 ist die hash-slices Rückkehr Schlüssel als auch als Werte mit%, wie in der letzten Zeile hier:
Ein hash ist eine ungeordnete container, aber der Begriff slice macht wirklich nur Sinn in Bezug auf einen bestellten container. Vielleicht schauen Sie in einem array. Sonst, Sie können nur entfernen Sie alle Elemente, die Sie nicht wollen, zu produzieren, Ihre "sub-hash'.