From
perldoc -f each:
When the hash is entirely read, a null array is returne
+d in
list context (which when assigned produces a false (0)
+value),
and "undef" in scalar context. The next call to "each"
+ after
that will start iterating again. There is a single ite
+rator
for each hash, shared by all "each", "keys", and "value
+s" func-
tion calls in the program; it can be reset by reading a
+ll the
elements from the hash, or by evaluating "keys HASH" or
+ "values
HASH".
So, your problem is that you're leaving the "single iterator" in the middle of the hash, and not resetting it. You'll need to reset it before entering the next loop.