2010-07-20 12 views
5

Ich habe einen Hash, der wie folgt aussieht:Umkehren einer Multi-Hash-Wert in Perl

{ bmw  => { id => 1, color => brown } } 
{ mercedes => { id => 2, color => black } } 

Ich möchte diesen Hash in Perl umkehren, so dass ich nur eine Abbildung von id erhalten => name_of_car. Muss ich die umgekehrte Funktion irgendwie verwenden?

Hinweis: Ich kann immer durch den ursprünglichen Hash laufen und die Schlüssel und Werte entsprechend den neuen Hash zuweisen, Mutter wollte ich wissen, ob es ein schlankeres Weg war.

+0

Ich denke, Sie sollten eine unserer Antworten akzeptieren. Wie kannst du glatter als Kinopikos ein Liner werden? – masonk

Antwort

6

Sie nicht eine glatte Art und Weise brauchen:

my %h = (
    bmw  => { id => 1, color => "brown" } , 
    mercedes => { id => 2, color => "black" } 
); 
my %j = map { ($h{$_}{id} => $_) } keys %h; 

for (keys %j) { 
    print "$_ $j{$_}\n"; 
} 

Ausgang:

 
$ ./silly.pl 
1 bmw 
2 mercedes 
+0

Hey, keine Notwendigkeit, auf deine Lösung zu verzichten. Dein Weg sieht für mich ziemlich glatt aus :). – masonk

+0

Dies ist nur der übliche Weg. –

+0

Ich sehe, dass wir verschiedene Definitionen von "Slick" haben – masonk

2

Was Sie hochgeladen haben, ist nicht gültig Perl, aber ich denke, dass ich Ihre Bedeutung nehmen. Eine glatte Möglichkeit, dies zu tun wäre mit einer hash slice und einer Karte.

my %hash = (
    bmw  => { id => 1, color => 'brown' }, 
    mercedes => { id => 2, color => 'black' }, 
); 
my %new_hash; 
@new_hash{ map { $_->{id} } values %hash } = keys %hash; 
+0

Warum wird ein Alias ​​(@) Symbol in der letzten Zeile vor new_hash verwendet? – syker

+0

@syker: Bitte schauen Sie auf den Link Masonk zur Verfügung gestellt "Hash-Scheibe". –

+0

Dies ist eine spezielle Syntax für ein Hash-Segment (oben verlinkt). Sie stellen eine Liste von Schlüsseln auf der linken Seite und eine Liste von Werten auf der rechten Seite zur Verfügung. Perl garantiert, dass die Reihenfolge, in der die Werte% hash zurückgegeben werden, der Reihenfolge entspricht, in der die Schlüssel% hash zurückgegeben werden. – masonk