2012-07-03 39 views
1

我在這裏有一段代碼,我在這裏比較六個散列的密鑰在一起,以找到所有這些密鑰中常見的密鑰。然後,我將每個散列的值合併到一個新散列中的一個值中。我想要做的是使這個可擴展。我希望能夠輕鬆從比較3次哈希到100次,而不必返回到我的代碼並改變它。有關我如何實現這一點的任何想法?其餘代碼對於不同的輸入量已經很好,但這是我堅持的一部分。比較常見密鑰合併值的多個散列

my $comparison = List::Compare->new([keys %{$posHashes[0]}], [keys %{$posHashes[1]}], [keys %{$posHashes[2]}], [keys %{$posHashes[3]}], [keys %{$posHashes[4]}], [keys %{$posHashes[5]}]); 
my %comboHash; 
for ($comparison->get_intersection) { 
$comboHash{$_} = ($posHashes[0]{$_} . $posHashes[1]{$_} . $posHashes[2]{$_} . $posHashes[3]{$_} . $posHashes[4]{$_} . $posHashes[5]{$_}); 
} 
+0

只需創建一個子例程並將哈希引用傳遞給它,那麼您可以輕鬆地在其中執行必要的循環。例如。 '我的@hashes = @_;爲我的$ href(@ hashes){...}'。 – TLP

回答

0

創建一個子程序:

sub combine_hashes { 
    my %result =(); 
    my @hashes = @_; 
    my $first = shift @hashes; 
    for my $element (keys %$first) { 
    my $count = 0; 
    for my $href (@hashes) { 
     $count += (grep {$_ eq $element} (keys %$href)); 
    } 
    if ($count > $#hashes) { 
     $result{$element} = $first->{$element}; 
     $result{$element} .= $_->{$element} for @hashes; 
    } 
    } 
    \%result; 
} 

並稱之爲:

my %h = %{combine_hashes(\%h1, \%h2, \%h3)}; 

...或:

my %h = %{combine_hashes(@posHashes)}; 
1
my %all; 
for my $posHash (@posHashes) { 
    for my $key (keys(%$posHash)) { 
     push @{ $all{$key} }, $posHash->{$key}; 
    } 
} 

my %comboHash; 
for my $key (keys(%all)) { 
    next if @{ $all{$key} } != @posHashes; 
    $comboHash{$key} = join('', @{ $all{$key} }); 
} 
+0

目前還不清楚「我將六個哈希鍵的關鍵字進行比較,以找出所有這些關鍵詞中常見的哈希鍵」。我認爲你是在尋找所有哈希通用的密鑰。如果它意味着你想比較這些鍵的值,你只需要改變'next'行。 – ikegami

0

只是做一個子程序,並通過它哈希引用

my $combination = combine(@posHashes); 

sub combine { 
    my @hashes = @_; 
    my @keys; 
    for my $href (@hashes) { 
     push @keys, keys %$href; 
    } 
    # Insert intersection code here.. 
    # ..... 
    my %combo; 
    for my $href (@hashes) { 
     for my $key (@intersection) { 
      $combo{$key} .= $href->{$key}; 
     } 
    } 
    return \%combo; 
} 
0

有非常簡單的解決方案:

sub merge { 
    my $first = shift; 
    my @hashes = @_; 
    my %result; 
    KEY: 
    for my $key (keys %$first) { 
     my $accu = $first->{$key}; 
     for my $hash (@hashes) { 
      next KEY unless exists $hash->{$key}; 
      $accu .= $hash->{$key}; 
     } 
     $result{$key} = $accu; 
    } 
    return \%result; 
} 

您必須用散列引用來調用它,它也將返回哈希引用例如:

my $comboHashRef = merge(@posHashes);