my %merge; for my $key ( keys %myhash ) { push @{ $merge{ join $;, sort @{ $myhash{$key}} } }, $key; } #### #! perl -w use strict; use Data::Dumper; my %d = ( a => [ 'one', 'two' ], b => [ 'one' ], c => ['one', 'two'], d => ['two', 'one'], e => [ 'one', 'two', 'three' ] ); my %merge; for my $key ( keys %d ) { push @{ $merge{ join $;, sort @{ $d{$key}} } }, $key; } print Data::Dumper->Dump( [\%d, \%merge], ['d','merge'] ); __END__ $d = { 'e' => [ 'one', 'two', 'three' ], 'a' => [ 'one', 'two' ], 'b' => [ 'one' ], 'c' => [ 'one', 'two' ], 'd' => [ 'two', 'one' ] }; $merge = { 'one' => [ 'b' ], 'one‡˜three‡˜two' => [ 'e' ], 'one‡˜two' => [ 'a', 'c', 'd' ] };