2010-07-20 69 views
5

我有一個哈希看起來像這樣:沖銷多值哈希在Perl

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

我要扭轉在Perl這個哈希這樣我只是得到ID => name_of_car的映射。我需要以某種方式使用反向功能嗎?

注意:我總是可以遍歷原始散列,並在新散列中相應地分配鍵和值,我想知道是否存在一種滑動方式。

+0

我認爲你應該接受我們的答案之一。你怎麼能比Kinopiko的一個班輪滑溜? – masonk 2010-07-26 00:11:21

回答

6

不需要一個漂亮的方式:

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

輸出:

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

嘿,沒必要在你的解決方案。你的方式看起來很漂亮:)。 – masonk 2010-07-20 02:04:18

+0

雖然這只是通常的方式。 – 2010-07-20 03:03:31

+0

我看到我們對「光滑」有不同的定義 – masonk 2010-07-20 13:32:19

2

您發佈的內容無效perl的,但我想我把你的意思。一個光滑的方式來做到這一點將是一個hash slice和一張地圖。

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

爲什麼在new_hash之前的最後一行使用別名(@)符號? – syker 2010-07-20 01:15:14

+0

@syker:請看看masonk提供的有關「散列片」的鏈接。 – 2010-07-20 01:19:18

+0

這是散列片段的特殊語法(上面鏈接)。您在左側提供一個鍵列表,在右側提供一個值列表。 Perl保證返回值%hash的順序與返回鍵%hash的順序相同,所以這是有效的。 – masonk 2010-07-20 01:20:11