2012-11-06 112 views
3

有一個問題,解釋正是我想在這裏:how to merge 2 deep hashes in perl結合2+「深」(多維)散列在Perl

然而,答案似乎有不爲我工作(建議使用Merge模塊)。

我有兩個哈希值,像這樣:

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

如果我使用Hash::Merge%c = {%a,%b}格式每次都是這樣,我得到:

$VAR1 = '57494'; 
$VAR2 = { 
      'name_address' => 'Peter Smith', 
      'address' => '5 Cambridge Road', 
      'post_code' => 'CR5 0FS' 
     }; 

(因此,它基本上與第二改寫第一數據並且弄亂了鍵)當我想要時:

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

因此,當密鑰相同時,數據會合並在一起,否則新密鑰將被添加到結尾。我希望這是有道理的。也許我使用Merge錯誤地做了一些事情,或者需要'手動'將它們添加到循環中,但是我花了太多時間思考它,無論如何!

編輯:我如何使用合併,看看我在做一些愚蠢的:

我:

use Hash::Merge qw(merge); 

...hash data above as %hash1 and %hash2... 

my %combined_hash = %{ merge(%hash1,%hash2) }; 
print Dumper(%combined_hash); 
+1

我不知道。我使用[**'Hash :: Merge' **](http://search.cpan.org/perldoc?Hash::Merge)或[**'Hash :: Merge :: Simple']來獲得所需的結果。 **](http://search.cpan.org/perldoc?Hash::Merge::Simple)。 – Axeman

+0

向我們展示代碼! –

+0

您示例數據中的'}'太多了...... – simbabque

回答

6

如果我用引用來做,它就像一個魅力。

use strict; use warnings; 
use Data::Dumper; 
use Hash::Merge qw(merge); 
my $h1 = { 
    '57494' => { 
    'name' => 'John Smith', 
    'age' => '9', 
    'height' => '120' 
    }, 
    '57495' => { 
    'name' => 'Amy Pond', 
    'age' => '17', 
    'height' => '168' 
    } 
}; 

my $h2 = { 
    '57494' => { 
    'name_address' => 'Peter Smith', 
    'address'  => '5 Cambridge Road', 
    'post_code' => 'CR5 0FS' 
    } 
}; 

my $h3 = merge($h1, $h2); 
print Dumper $h3; 

輸出:

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

但是,如果我用哈希散列而不是裁判做到這一點,它不:

my %hash1 = (
    '57494' => { 
    'name' => 'John Smith', 
    'age' => '9', 
    'height' => '120' 
    }, 
    '57495' => { 
    'name' => 'Amy Pond', 
    'age' => '17', 
    'height' => '168' 
    } 
); 

my %hash2 = (
    '57494' => { 
    'name_address' => 'Peter Smith', 
    'address'  => '5 Cambridge Road', 
    'post_code' => 'CR5 0FS' 
    } 
); 

my %h3 = merge(%hash1, %hash2); 
print Dumper \%h3; 

__END__ 
$VAR1 = { 
    '57495' => undef 
}; 

這是因爲mergeHash::Merge能只有參考,但你傳遞它的哈希值。另外,您需要在標量上下文中調用它

嘗試它像這樣:

#        +--------+--- references 
# ,-- SCALAR context  |  | 
my $combined_hash = %{ merge(\%hash1, \%hash2) }; 
print Dumper($combined_hash); 
+0

啊你知道,我有我的原始版本作爲參考,但這樣做: '我%h3 =%{合併($ h1,$ h2)};'但是當我改變它爲純引用,它似乎工作。奇怪的! 我覺得有點傻,我錯過了嘗試這種組合,但謝謝你讓我清楚! – dgBP

+0

@bladepanthera它有一個錯誤。關鍵字(不是散列鍵)是引用兩個參數散列,但要在標量上下文中調用它。你需要'$ combined_hash',而不是'%combined_hash'。然後你可以引用你傳遞給'merge'的哈希,並且不需要把它們放在引用變量中。 – simbabque

+0

你明白了。謝謝 – dgBP

1
for my $key (keys %fromhash) { 
    if(not exists $tohash{$key}) { 
     $tohash{$key} = {}; 
    } 
    for my $subkey (keys %{$fromhash{$key}}) { 
     ${$tohash{$key}}{$subkey} = ${$fromhash{$key}}{$subkey}; 
    } 
} 

隨着這取決於我的最後的咖啡是否是任何或多或少牙套好。

的Python絕對是這種事情更舒適,因爲它不會讓你想引用:

for key in fromdict: 
    if key not in todict: 
     todict[key] = {} 
    todict[key] = dict(fromdict[key].items() + todict[key].items()) 

或者,如果todictdefaultdict(創建上閱讀以及分配鍵):

for key in fromdict: 
    todict[key] = dict(dict(fromdict[key]).items() + dict(todict[key]).items()) 
+0

我沒有得到咖啡的參考。 – simbabque

+2

然後你還沒有足夠的咖啡。 –

+2

事實上,在第5行中還需要一個大括號:'keys%{$ fromhash {$ key}})'。我會堅持約克郡茶。 =) – simbabque