The CPAN module Tie::DxHash will allow you to
make a hash that retains the order the keys were entered,
and allows duplicate keys as well.
Here's a short example to show you how simple it's
tie my %hash, 'Tie::DxHash';
%hash = (
a => 1,
a => 2,
b => 2,
b => 3,
An interesting thing to note is that in the assignment
to %hash the duplicate keys are not clobbered.
You can then iterate over this hash using while/each or
a foreach/keys, and the elements will be returned in
the order they were inserted into the hash.