$ perl -Mstrict -Mwarnings -E ' use Data::Dumper; my %data = ( A => { a => {f => 1, g => 1, h => 1}, b => {i => 1}, c => {j => 1, k => 1}, }, B => { d => {l => 1, m => 1}, e => {n => 1}, }, ); for my $key (keys %data) { my $count = 0; map { $_ = ++$count for values $data{$key}{$_} } keys $data{$key}; } print Dumper \%data; ' $VAR1 = { 'B' => { 'e' => { 'n' => 1 }, 'd' => { 'l' => 2, 'm' => 3 } }, 'A' => { 'b' => { 'i' => 1 }, 'a' => { 'h' => 2, 'g' => 3, 'f' => 4 }, 'c' => { 'j' => 5, 'k' => 6 } } };