in reply to problem with hash keys
Hashes do not preserve insertion order. In other words, it is
simply a fluke that your examples #1 and #2 print out the hash
keys in the correct order; they are the exception rather than
the rule.
If you just want the keys sorted alphabetically, use
But you may run into situations where you really do want to preserve insertion order, and it's not just a matter of sorting alphabetically.for my $k (sort keys %GRAMMAR) {
If you want to preserve insertion order and still use a hash, take a look at Tie::IxHash. Or, if you're not wedded to a hash, you could always use an array, and push array refs onto your list of grammars:
And then when iterating:push @GRAMMAR, [ $1, $2 ];
BTW, when you do a regex match w/ capturing parens, you really should check whether the regex successfully matches:for my $rec (@GRAMMAR) { print $rec->[0], "\n"; }
That way, if the regex fails--ie. the line you're looking at doesn't match that regex--you'll just skip that line. You don't want to use $1 and $2 if the match was unsuccessful, because there's no telling what they could contain. :)next unless /([A-Z]) -> (.*)/; $GRAMMAR{$1} = $2;
In Section
Seekers of Perl Wisdom