2012-07-03 2 views
1

을 병합 비교 I가 내가 그들 모두 사이에 공통적 인 사람을 찾기 위해 함께 여섯 해시의 키를 비교하고 여기에 코드의 작업 비트. 그런 다음 각 해시의 값을 새 해시의 한 값으로 결합합니다. 제가하고자하는 것은 이것을 확장 가능하게 만드는 것입니다. 난 쉽게 내 코드로 다시 갈 필요하고이를 변경하지 않고 100-3 해시를 비교에서 갈 수 있도록하고 싶습니다. 이걸 어떻게 성취 할 수 있을지에 대한 생각? 코드의 나머지 부분은 이미 다른 입력 양에 대해 잘 작동하지만, 이것이 내가 막힌 부분입니다. 같은일반적인 키에 대한 여러 해시 값

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

... 나 :

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

단지를 만들 서브 루틴을 만들고 해시 참조를 전달하면 내부에서 필요한 루핑을 쉽게 수행 할 수 있습니다. 예 : 'my @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; 
} 

을에 의해 호출

,532 10
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

"나는 6 가지 해시의 열쇠를 모두 비교하여 그 중 공통점을 찾는 열쇠가 무엇인지"는 분명하지 않습니다. 나는 모든 해시에 공통적 인 키를 찾는다는 의미로 사용했습니다. 해당 키의 값을 비교한다는 의미라면'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);