The way that I routinely deal with things like this is to use File::Find, or File::Find::Object, or any one of their many brethren.
Basically, my thought is, a very complete and well thought out solution to this very well-known task is at my fingertips, so I’m gonna grab it and use it and move on. I encourage you to do likewise.
Also, and on a more general level, sometimes file-searches will be disrupted by things that you do to those files or to the filesystem within that loop. This seems to be particularly true in Microsoft Windows. Therefore, my customary approach is to build the list-of-files first, explicitly close the search, and then to go back and process that list. The exact details depending upon the number of files that I expect to see.