Listing 2. p2.pl Code
#!/usr/bin/perl -dw
require 5.001;
# Code to demonstrate more advanced debugging
# techniques.
# This program will start in the current directory
# and recursively locate all files in the
# directory and all subdirectories.
@files = searchdir("."); # here we go
foreach (@files) {
print "$_\n";
}
# To do this, we'll call a subroutine that will
# open a directory and generate two arrays based.
# One will be an array of all files in the
# directory, and the other will be of all the
# subdirectories. Then, for each value in the
# subdirectory array, we'll recursively call the
# subroutine. Each time the subroutine finishes,
# it will return the # array of files.
sub searchdir { # takes a directory as an argument
my($dir) = @_;
my(@files, @subdirs);
opendir(DIR,$dir) or die "Can't open \"
$dir\" for reading: $!\n";
while(defined($_ = readdir(DIR))) {
/^\./ and next; # if file begins with '.', skip
### SUBTLE HINT ###
if( -f $_) { # if it's a file...
push @files, $_; # save it
} elsif( -d $_ ) { # else if it's a directory...
push @subdirs, $_; # save it
}
# no else, because we will ignore things that
# aren't files or dirs
}
closedir DIR or warn "Huh?? Can't close \"
$dir\": $!\n";
foreach $_ (@subdirs) { # for each subdirectory
# found earlier...
push @files, searchdir($_); # put all files found
# within $_ onto list
}
@files; # return all the file we found
} # END of searchdir