sub searchInDirectory
{
my @directorylist;
opendir my $dir, $_[0] or die "Unable to open directory";
while (my $file = readdir $dir)
{
if(-f "$file")
{
#process file
}
elsif((-d "$file") && !($file =~ /^\.{1,2}$/)) #directory && not .. or .
{
push @directorylist, $file;
}
}
closedir($dir);
foreach my $diritem (@directorylist)
{
&searchInDirectory($_[0] . "/" . $diritem);
}
}
这是我递归遍历目录的子目录和文件的代码。问题是它在第一次传递时起作用,但在第二次调用时,目录检查将失败。我已经检查过以确保它正确识别文件与文件夹,它就是这样。它也没有打开目录,所以我不知道它为什么不能识别它们,并再次调用该函数。如果可能的话,我真的很想坚持使用这种方法,而不是使用其他库。
答案 0 :(得分:4)
readdir
不返回完整路径,因此您需要在尝试进行文件测试之前添加目录:
sub searchInDirectory {
my $path = shift;
opendir(my $dh, $path) or die $!;
my @files = map { "$path/$_" } grep { not /^\./ } readdir($dh);
closedir($dh);
for my $file (@files) {
if (-d $file) {
searchInDirectory($file);
} elsif (-f $file) {
# process file
}
}
}
答案 1 :(得分:1)
请注意,使用File::Find::Rule
可以简化文件搜索例程。例如:
File::Find::Rule->file->exec( sub { say "File: $_" } )->in( $dir );