我在这里有一些工作的代码,我将六个哈希的密钥进行比较,以找到所有这些代码中常见的密钥。然后,我将每个哈希值与新哈希中的一个值组合在一起。我想做的是使这个可扩展。我希望能够轻松地将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 :(得分: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} });
}
答案 1 :(得分: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)};
答案 2 :(得分: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;
}
答案 3 :(得分: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);