How can I maintain the order of keys I add to a Perl hash?

hash, perl

Solution

Hashes are not ordered, but as usual, CPAN offers a solution: Tie::IxHash

use Tie::IxHash;
my %count;
tie %count, 'Tie::IxHash';

while ($line = <DATA>) {
$count{$line}++ if ( $line =~ /\S/ );
}

while( my( $key, $value)= each %count) {
    print "$key\t $value"; 
}

Problem

How can I maintain the order of actual list after counting its occurrence using a hash in the following program? For example, `<DATA>` are ``` a b e a c d a c d b etc. ``` Using hash, i counted the occurrence of each element. and what i want is: ``` a 3 b 2 e 1 c 2 d 2 ``` but the following program shows me otherwise. ``` my (%count, $line, @array_1, @array_2); while ($line = <DATA>) { $count{$line}++ if ( $line =~ /\S/ ); } @array_1 = keys(%count); @array_2 = values(%count); for(my $i=0; $i<$#array_1; $i++) { print "$array_1[$i]\t $array_2[$i]"; } ```

Original source