using standard module:
use File::Find;
find({ wanted => sub {
# for each file
# $_ is file name
# $File::Find::name is full path
# $File::Find::dir is directory path
}, preprocess => sub {
# process the list of files about to be wanted()
# $File::Find::dir is directory path
return @_;
}, follow => 0, # follow symlinks?
no_chdir => 0, # dont chdir (so $_ equals $File::Find::name)
}, @directories);
manually:
use strict;
sub act {
my ($file) = @_;
print "$file\n";
}
sub traverse {
my ($path,$wildcard) = @_;
$path =~ s#/+$##;
# Could be more efficient with an opendir
for my $file (glob("$path/*")) {
next unless (-d $file);
# actions to dirs go here
traverse($file,$wildcard);
}
for my $file (glob("$path/$wildcard")) {
act($file) if (-f $file);
}
}
my $path = $ARGV[0] || '.';
my $wildcard = $ARGV[1] || '*';
&traverse($path,$wildcard);