<?xml version="1.0" encoding="windows-1252"?>
<node id="89128" title="Re: problem with hash keys" created="2001-06-17 03:13:40" updated="2005-07-19 14:08:39">
<type id="11">
note</type>
<author id="2675">
btrott</author>
<data>
<field name="doctext">
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.&lt;p&gt;

If you just want the keys sorted alphabetically, use

&lt;code&gt;
    for my $k (sort keys %GRAMMAR) {
&lt;/code&gt;

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.&lt;p&gt;

If you want to preserve insertion order and still use a hash,
take a look at [cpan://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:

&lt;code&gt;
   push @GRAMMAR, [ $1, $2 ];
&lt;/code&gt;

And then when iterating:

&lt;code&gt;
    for my $rec (@GRAMMAR) {
        print $rec-&gt;[0], "\n";
    }
&lt;/code&gt;

BTW, when you do a regex match w/ capturing parens, you
really should check whether the regex successfully matches:

&lt;code&gt;
    next unless /([A-Z]) -&gt; (.*)/;
    $GRAMMAR{$1} = $2;
&lt;/code&gt;

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. :)</field>
<field name="root_node">
89124</field>
<field name="parent_node">
89124</field>
</data>
</node>
