1. Since there's an iterator for each hash, if I had only used 'last' in the inner while loop, then only the inner while loop cannot be re-entered.
2. Actually my script did not leave the iterator in the middle of the hash (it already read the only element in the hash before calling 'last'), it's just that 'each' can only be reset after calling 'each' ONE MORE time AFTER all elements were read. So the documentation above should be modified (because it incorrectly stated "it can be reset by reading all the elements from the hash", but my script did read all elements in the hash!).
Well, just want to be picky, after wasting much time on this error-prone iterator for 'each'. :)