2010-07-20 15 views
5

ho un hash che assomiglia a questo:Inversione un hash più valori in Perl

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

voglio invertire questa hash in Perl in modo che ho appena ottenere una mappatura delle id => name_of_car. Devo usare la funzione inversa in qualche modo?

Nota: Posso sempre ripetere l'hash originale e assegnare le chiavi e i valori di conseguenza nel nuovo hash, il dado che volevo sapere se c'era un modo di sfarfallio.

+0

Penso che dovresti accettare una delle nostre risposte. Come si può ottenere più liscia della fodera di Kinopiko? – masonk

risposta

6

Non hanno bisogno di un modo chiazza di petrolio:

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"; 
} 

uscita:

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

Ehi, non c'è bisogno di essere giù per la soluzione. La tua strada mi sembra abbastanza carina :). – masonk

+0

Questo è solo il solito modo però. –

+0

Vedo che abbiamo diverse definizioni di "slick" – masonk

2

Quello che hai postato non è perl valida, ma penso che mi prendo il tuo significato. Un modo semplice per farlo sarebbe con un hash slice e una mappa.

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

Perché un simbolo di alias (@) viene utilizzato sull'ultima riga prima di new_hash? – syker

+0

@syker: guarda il masonk del collegamento fornito su "hash slice". –

+0

Questa è una sintassi speciale per una hash slice (collegata sopra). Fornisci un elenco di chiavi sul lato sinistro e un elenco di valori sul lato destro. Perl garantisce che l'ordine in cui i valori% hash vengono restituiti è lo stesso ordine con cui vengono restituite le chiavi% hash, quindi funziona. – masonk