Well, I think more specifically why the assignment and the declaration ended up inside the loop together that way was that I followed basically these steps:
- copied the original code with the declaration at the top
- modified the code to clear the hashes inside the loop to reuse them
- noticed the hashes weren't actually used outside the loop
- moved the "my" inside the loop with the assignment
- stopped, not paying any attention to the fact that I now had a useless assignment.
So you can see it was at some point useful, but I actually added smell to that portion of the code by refactoring carelessly. That's something to consider when thinking about changing working code, I guess.
Update: I guess the above should say I put the code to clear the hashes inside the wrong loop the first time around. See Re^3: Array name with a Variable for a corrected version (or see the responses by those who didn't screw up the scoping in the first place). ;-)