From perldoc -f each
When the hash is entirely read, a null array is returne
list context (which when assigned produces a false (0)
and "undef" in scalar context. The next call to "each"
that will start iterating again. There is a single ite
for each hash, shared by all "each", "keys", and "value
tion calls in the program; it can be reset by reading a
elements from the hash, or by evaluating "keys HASH" or
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.