2013-12-13 48 views
3

中缺失的值是否有模塊或最佳方式來比較基於密鑰的2個散列並檢索並打印第一個和第二個散列中缺失的值?Perl比較基於密鑰的兩個散列並檢索

我有兩個散列描述了特定的配置。
我想比較兩種配置的歷史狀態。特別是我有興趣知道哪些鍵已被刪除,哪些鍵已被添加。無需知道密鑰的編輯位置(即不發生這種情況)。

例子:

Hash 1 keys: 
aaa 
bbb 
ccc 
ddd 

Hash 2 keys: 
aaa 
xxx 
bbb 
ccc 
yyy 

結果應該是這樣的:

xxx added 
ddd deleted 
yyy added 

任何想法?

+0

檢查了這一點http://stackoverflow.com/questions/6978799/comparing-two-hashes-with-the-keys-and-values – PseftiS

回答

0

對散列1的所有keys進行迭代。對於每個檢查,散列2中的exists。如果不是,則它已被刪除。如果是這樣,delete密鑰形式散列2.一旦完成,散列2中所有剩餘的keys都是已添加的。

編輯:我假設你知道如何在Perl中編寫代碼,只需要一個想法。如果答案聽起來很奇怪,請查看在Perldoc中寫入like this的文字。

0
use warnings; 
use strict; 

my @array1 = qw (aaa bbb ccc ddd); 
my @array2 = qw(aaa xxx bbb ccc yyy); 
my (%hash1, %hash2); 

@hash1{@array1} = 1; 
@hash2{@array2} = 1; 

foreach (keys %hash2){ 
    print "added $_\n" unless exists $hash1{$_}; 
} 

foreach (keys %hash1){ 
    print "removed $_\n" unless exists $hash2{$_}; 
} 

打印:

added xxx 
added yyy 
removed ddd 
+0

完美的作品,非常感謝! – user3098583

+0

@ user3098583沒問題。你應該選擇正確的答案,如果它達到你想要的東西 – fugu

2

您可以使用List::Compare此任務:

use strict; 
use warnings; 
use List::Compare; 

my %hash1 = map { $_ => undef } qw/aaa bbb ccc ddd/; 
my %hash2 = map { $_ => undef } qw/aaa xxx bbb ccc yyy/; 

my $lc = List::Compare->new([ keys %hash1 ], [ keys %hash2 ]); 

my @hash1Only = $lc->get_Lonly; 
my @hash2Only = $lc->get_Ronly; 

print "Added: @hash2Only\nDeleted: @hash1Only\n"; 

輸出:

Added: xxx yyy 
Deleted: ddd 

希望這有助於!

2
sub compare { 
    my ($a, $b) = @_; 
    [grep !exists $b->{$_}, keys %$a], [grep !exists $a->{$_}, keys %$b]; 
} 

my @keys1 = qw(aaa bbb ccc ddd); 
my @keys2 = qw(aaa xxx bbb ccc yyy); 
my (%hash1, %hash2); 
@hash1{@keys1}=(); 
@hash2{@keys2}=(); 
my ($deleted, $added) = compare(\%hash1, \%hash2); 
print "Added: @$added, Deleted: @$deleted\n"; 
+0

好而簡單。這是否適用於多維數組?即 my @ keys1 = [「11-AA」,「11」,「AA」,「1.0」,「98.375」,「48.375」,「0.0」,「0.0」 BB「,」22「,」BB「,」1.0「,」97.375「,」58.375「,」0.0「,」0.0「,],); – Wavesailor