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
for my $k (sort keys %GRAMMAR) {
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.
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:
push @GRAMMAR, [ $1, $2 ];
And then when iterating:
for my $rec (@GRAMMAR) {
print $rec->[0], "\n";
}
BTW, when you do a regex match w/ capturing parens, you
really should check whether the regex successfully matches:
next unless /([A-Z]) -> (.*)/;
$GRAMMAR{$1} = $2;
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. :)
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
Outside of code tags, you may need to use entities for some characters:
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.