递归调用时Perl目录检查失败

时间:2016-05-31 22:17:02

标签: perl recursion

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);
    }
}

这是我递归遍历目录的子目录和文件的代码。问题是它在第一次传递时起作用,但在第二次调用时,目录检查将失败。我已经检查过以确保它正确识别文件与文件夹,它就是这样。它也没有打开目录,所以我不知道它为什么不能识别它们,并再次调用该函数。如果可能的话,我真的很想坚持使用这种方法,而不是使用其他库。

2 个答案:

答案 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 );