sub FindFileInDir { my $dir = $_[0]; #print "$dir\n"; opendir(DIR, $dir|| die "can't open this $dir"); my @files = readdir(DIR); closedir(DIR); for my $file (@files){ next if($file =~ m/\.$/ || $file =~ m/\.\.$/); if ($file =~ /\.(c|h|cpp)$/i) { print "$dir\/$file \n"; #push(@FileFolder, "$dir\/$file"); } elsif(-d "$dir/$file") { &FindFileInDir("$dir/$file" ); } } }
如果你不喜欢递归,我们可以试试迭代的方式。
sub FindFileInDirWithStack { my $dir = $_[0]; my @FolderStack = (); push(@FolderStack, $dir); while(1) { my $currentSearchFolder = pop(@FolderStack); if(defined($currentSearchFolder) == 0) { last; } opendir(DIR, $currentSearchFolder|| die "can't open this $currentSearchFolder"); my @files = readdir(DIR); closedir(DIR); for my $file (@files){ next if($file =~ m/\.$/ || $file =~ m/\.\.$/); if ($file =~ /\.(c|h|cpp)$/i) { print "$currentSearchFolder\/$file \n"; } elsif(-d "$currentSearchFolder/$file") { push(@FolderStack, "$currentSearchFolder/$file"); } } } }