use Data::Dumper; use strict; use warnings; my %hash; assignWithDupes([ "one" => "1", "two" => "2", "one" => "3", "three" => "4", "two" => "5", "one" => "6", ], \%hash); print Dumper(\%hash); sub assignWithDupes { my ($arr, $hash) = @_; my ($i, $j, $key, $val); for ($i = 0; $i < $#$arr; $i += 2) { $key = $arr->[$i]; $val = $arr->[$i+1]; if (!defined $hash->{$key}) { $hash->{$key} = $val; next; } for ($j = 2; defined $hash->{"${key}_$j"}; $j++) {} $hash->{"${key}_$j"} = $val; } }