2012-11-05 117 views
2

我有一個哈希值(HoH),我在使用mysql查詢時使用了select_allhashref。 格式對於我想要的是完美的,我有兩個類似的手段HoH。我可以在Perl的另一個哈希中重命名哈希鍵嗎?

我想最終將這些HoH合併在一起,唯一的問題(我認爲)是,在一個HoH的'子哈希'中有一個與另一個HoH具有相同名稱的密鑰。 例如

my $statement1 = "select id, name, age, height from school_db"; 
my $school_hashref = $dbh->selectall_hashref($statement1, 1); 

my $statement2 = "select id, name, address, post_code from address_db";  
my $address_hashref = $dbh->selectall_hashref($statement2, 1); 

所以,當我轉儲數據我得到的結果如下所示:

$VAR1 = { 
      '57494' => { 
         'name' => 'John Smith', 
         'age' => '9', 
         'height' => '120' 
        } 
     } 
}; 
$VAR1 = { 
      '57494' => { 
         'name' => 'Peter Smith', 
         'address' => '5 Cambridge Road', 
         'post_code' => 'CR5 0FS' 
        } 
     } 
}; 

(這是一個例子所以似乎不合邏輯有不同的名字,但我需要它:))

所以我想重命名'name''address_name'等等。這可能嗎?我知道你能做

$hashref->{$newkey} = delete $hashref->{$oldkey}; 

(編輯:這是我在網上找到的例子,但還沒有測試過)。

,但我不知道我怎麼會代表'id'部分。有任何想法嗎?

回答

4

不知道將它們合併在一起的方式,最簡單的解決方案可能是簡單地更改select語句以重命名結果中的列。而不是試圖在之後操作哈希。

my $statement2 = "select id, name as address_name, address, post_code from address_db";  
my $address_hashref = $dbh->selectall_hashref($statement2, 1); 

如果這是不適合你,然後一個現實的選擇循環可能是你最好的選擇

foreach (keys %{$address_hashref}) { 
    $address_hashref->{$_}{$newkey} = delete $address_hashref->{$_}{$oldkey} 
} 
+0

是完美的。好人! – dgBP

3

您有$hashref->{$newkey} = delete $hashref->{$oldkey};因爲散列的實現方式做到這一點。

你也可以用散列哈希來實現。

$hashref->{$key_id}{$newKey} = delete $hashref->{$key_id}{$oldKey}; 

散列函數被用於將密鑰變換到一個數組元素(槽或桶),其中相應的值要被尋求的索引(散列)。

這裏有一個簡單的例子:

我們的哈希

{ 
    'a' => "apples", 
    'b' => "oranges" 
} 

讓我們來定義我們的哈希函數idx = h(key)和使用我們鍵功能上面給我們:

h('a') = 02; 
h('b') = 00; 

如何其存儲在陣列或桶

idx | value 
00 | 'oranges' 
01 | '' 
02 | 'apples' 
03 | '' 
... and so on 

假設我們希望他們的'蘋果'鍵是'c'。我們不能簡單地將密鑰更改爲'c',因爲哈希函數總是爲'a'返回02,並且會爲'c'返回不同的內容。所以,如果我們想要改變密鑰,我們還必須將該值移至數組/存儲桶中正確的idx。

嗯,它可能沒有什麼不同,但那是一次碰撞。碰撞是一個特殊情況,在執行哈希時需要處理。

有關在散列的詳細信息:

http://en.wikipedia.org/wiki/Hash_table

How are hash tables implemented internally in popular languages?

+0

一個很好的解決方案和很好的解釋+1。重命名列更容易,但如果它不起作用,那麼我會使用它。 – dgBP