use strict; use warnings; use Data::Dumper; my %example = ( a => 'red', b => 'blue', c => 'red', d => 'green', e => 'red', ); my %desired = ( a => 'red', b => 'blue', c => 'red1', d => 'green', e => 'red2', ); my %seen; while (my ($letter, $color) = each %example) { if ($seen{$color}++) { $example{$letter} = $color . $seen{$color}; next; } $example{$letter} = $color } print Dumper( \%desired, \%example );