in reply to Directory available?

You can try following code (untested)

my $separator = ($^O eq 'MSWin') ? '\' : '/'; sub readFiles { my $ipath = shift; my @files; opendir(sDir, $ipath) || die "Unable to open directory '$ipath': $!"; for (readdir(sDir)) { if (!/^\.{1,2}$/ && -d $iPath . $separator . $_) { # recursive call for directory readFiles($iPath . $separator . $_); } else { # collect matching files push @files, $_ if /\.mat$/; } } closedir(sDir); for (@files){ print FILE $ipath, $separator, $_, "\n"; } }

Replies are listed 'Best First'.
Re^2: Directory available?
by kingjamesid (Acolyte) on Oct 24, 2009 at 23:56 UTC
    Thanks
Re^2: Directory available?
by afoken (Chancellor) on Oct 25, 2009 at 08:52 UTC

    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". ;-)