while ($name = shift @inp_names) { for $canon ((canonical($name))) { #extra parens force list # add $name to an anon array, stored under the $canon key push @{$possible_matches{$canon}}, $name; } } for $canon (keys %possible_matches) { print "matches under $canon= ", join(',', @{$possible_matches{$canon}}) "\n"; } # for illustration. untested