use Data::Dumper; my %orig = ( 'abc,def' => { ',,,item4' => 1, 'item1,,,' => 1, ',item2,,' => 1, }, 'kln,mno' => { ',,,item4' => 1, 'item1,,,' => 1, }, ); my %new; foreach my $top ( keys %orig ) { push @{$new{$top}}, $_ for keys %{$orig{$top}}; } print Dumper \%new; #### $VAR1 = { 'abc,def' => [ 'item1,,,', ',item2,,', ',,,item4' ], 'kln,mno' => [ 'item1,,,', ',,,item4' ] };