foreach my $i ( 0..$#data ) { my %keys = keys %dataPos; # Changed hash name to match hash OP is building my $hkey = $data[$i]; # Changed data lookup to array to match OP code. if ((my @found = grep /^$hkey$/, %keys) > 1) { $hkey .= '_'; } $dataPos{$hkey} = $i; print "$data[$i] -- > $i\n"; } #### foreach my $i ( 0..$#data ) { my $key = $data[i]; # append '_' until no matching key exists. while ( exists $dataPos{$key} ) { $key .= '_'; } $dataPos{$key} = $i; print "$key -- > $i\n"; }