Notes and Problems:
- Windows (and DOS and OS/2) accepts a forward slash as path separator, there is no need for $separator. If you want true multi-platform code, use File::Spec, which also handles classic MacOS and more exotic platforms.
- $^O is never MSWin. It may be MSWin32 or perhaps MSWin64.
- readFiles() is a bad name, as this function does not read files. It reads directories and print file names found there matching a hardcoded regular expression.
- The function should really return a list of file names instead of printing them.
- Recursion is not needed here, you could use a simple worklist (array) instead, containing directories to be processed.
- Because you use a global directory handle (sDir) instead of a local handle (my $dir) or at least a localized handle (local *sDir), every recursion will automatically close and re-open the handle. Your code only works by accident, because you used for (readdir(sDir)) instead of while (defined($_=readdir(sDir))), reading the entire directory list into memory before iterating over it. Still, each and every call to closedir except for the first one will fail with "Bad file descriptor".
- There is no need to reinvent directory tree walkers, there are several on CPAN that do not pollute namespaces, that properly check for errors, that work cross-platform, and that do not slurp everything into memory. And, of course, they have parameters allowing to customize the search.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)