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"; }