![]()
#!/usr/bin/perl -w use strict; ####################################################################### ## Browser using a callback sub BrowseDir (&$$) { my($CallBack, $Dir, $Recurse) = @_; if(ref $CallBack ne 'CODE') { # second check if the compiler can't use the prototype # of this subroutine my($Package, $FileName, $Line) = caller; die "BrowseDir Error: 1st parameter needs to be a" "subroutine reference at $FileName line $Line\n"; } local *DIR; # Localize for the recursion. opendir(DIR, $Dir) or die "Can't open '$Dir': $!"; if($Dir eq '/') { $Dir = ''; } # We already assume the / in the directory... while( my $File = readdir DIR ) { if($File ne '.' && $File ne '..') { &$CallBack($Dir, $File); # Call the callback subroutine if( $Recurse && -d "$Dir/$File" ) { BrowseDir($CallBack, "$Dir/$File", $Recurse); } } } closedir(DIR); }
my $Directory; my $Recurse; GetDirectory: { print "Directory: "; chomp( $Directory = <STDIN> ); if( '' eq $Directory) { redo; } if( ! -e $Directory) { print "That directory does not exist!\n"; redo GetDirectory; } if( ! -d $Directory) { print "That is not a directory!\n"; redo GetDirectory; } } GetRecurse: { print "Go through subdirs: "; $Recurse = lc(getc); # There are better ways then getc, see perldoc -f getc chomp $Recurse; if ($Recurse eq 'y') { $Recurse = 1; } elsif($Recurse eq 'n') { $Recurse = 0; } elsif($Recurse ne 1 && $Recurse ne 0) { print qq["$Recurse"]; print "Bad input [y/n]\n"; redo GetRecurse; } } print "\nRecurse is $Recurse\n\n";
We can pass the BLOCK directly because the BrowseDir subroutine is prototyped
as
Written by Diederik van der Boor at 17 November 2001
my $I = 0;
BrowseDir
{
$I++;
print "$_[0]/$_[1]\n";
} $Directory, $Recurse;
print "\n$I file(s) found\n\n";