in reply to Recursive Directory Listings

You're not really doing this recursively. It looks like your loop will only descend one level. File::Find is the canonical way to walk a directory tree.

If you modify this to recurse by defining a sub which calls itself on seeing a directory, be careful to not clobber the newDIR global handle. You can do that by either localizing the global handle or else using lexical handles.

After Compline,
Zaxo

Replies are listed 'Best First'.
Re^2: Recursive Directory Listings
by shagbark (Acolyte) on Nov 01, 2014 at 17:47 UTC
    I gotta complain about the idea that File::Find is the canonical way to traverse a directory. File::Find calls a subroutine of your choice on each file it traverses, but if you want to save the results from processing those files, you have to save them in a global variable, because there's no way to capture the return values from your subroutine. Not to mention there are a lot of things that are hard to do with it. Try to use File::Find just to construct a hash with the directory structure. You can do it, but you'll have to parse the full path to the file and traverse your hash structure to insert each element, using about 10 times as much code as just saying push(@{$hash{$dir}, $file). File::Find is hard to use and leads to bad code. I never use it anymore except for the simplest of tasks.
      you have to save them in a global variable, because there's no way to capture the return values from your subroutine

      That's not quite true; you can save the results in any lexical variable in scope of the sub.

      I reckon we are the only monastery ever to have a dungeon stuffed with 16,000 zombies.

      I gotta complain about the idea that File::Find is the canonical way to traverse a directory ... I use it ...

      That argument could be made in 2005 that File::Find probably is canonical ... you could also make that argument today :)

      I prefer File::Find::Rule