4

ここで私が欲しいものを正確に説明する質問があります: perl で 2 つの深いハッシュをマージする方法

ただし、そこにある答えは私にはうまくいかないようです(Mergeモジュールの使用の提案)。

私は次のような2つのハッシュを持っています:

$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'
        };

(したがって、基本的に最初のデータを2番目のデータで上書きし、キーを台無しにしました)必要な場合:

$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か、「手動で」ループに追加する必要があるかもしれませんが、とにかく、それについて考えるのに多くの時間を費やしています!

編集: Merge を使用して、何かばかげたことをしているかどうかを確認する方法:

私は持っている:

use Hash::Merge qw( merge );

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

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

2 に答える 2

7

参照を使用すると、魅力的に機能します。

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
};

これは、mergefrom Hash::Mergeが参照しか取得できないためですが、ハッシュを渡しているためです。さらに、スカラー コンテキストで呼び出す必要があります。

次のように試してください:

#                             +--------+--- references
#   ,-- SCALAR context        |        |
my $combined_hash = %{ merge( \%hash1, \%hash2 ) };
print Dumper($combined_hash);
于 2012-11-06T12:52:07.673 に答える
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())
于 2012-11-06T12:40:11.657 に答える