in reply to file::find::name question

File::Find does a depth first traversal of a directory structure. For each directory, it uses readdir to obtain the directory's contents. Perl's documentation of readdir doesn't define an order, presumably leaving that up to the operating system. Excluding the depth-first part of the traversal, and just focusing on the files within each directory, themselves, it will list them in the order that readdir obtains them. There is no simple way to impose your own behavior on the internal readdir().

However!!! There's a hook. ;) There is the preprocess option, which provides a hook you could use to sort the directory as you see fit before &wanted is called.

Here's the relevant explanation from the File::Find POD:

preprocess

The value should be a code reference. This code reference is used to preprocess the current directory. The name of the currently processed directory is in $File::Find::dir. Your preprocessing function is called after readdir(), but before the loop that calls the wanted() function. It is called with a list of strings (actually file/directory names) and is expected to return a list of strings. The code can be used to sort the file/directory names alphabetically, numerically, or to filter out directory entries based on their name alone.

Update: I looked at the source code to clarify one thing that wasn't clear in the documentation. The documentation said that the preprocess coderef would be executed before the loop that calls wanted(), but it didn't specify if the depth-first traversal would dive in deeper beforehand or not. As it turns out, the answer is no, which (to me) seems like a good thing. That means you can re-order (or even remove items from) the list before File::Find dives into the next level. I've long disliked the callback user interface for File::Find, with its heavy use of global variables rather than passing parameters explicitly to &wanted(). But now I've found one thing I like about it. ;)


Dave