首次评估后,Perl DosGlob失败了

时间:2015-08-07 12:22:40

标签: regex perl glob

我有一个脚本,它会弹出特定目录下相应文件的文件名和上次修改时间。我使用DosGlob模块来指定正则表达式。

示例目录结构是:
//share16/ABC/X/Output/1/
//share16/ABC/X/Output/2/
//share16/ABC/Y/Output/1/
//share16/ABC/Y/Output/2/

以下是执行上述操作的代码,此后还有其他代码,不在目前的上下文中。

use File::DosGlob 'glob';
my @dir_regex = glob "//share16/ABC/*/Output/";
for my $dir (@dir_regex) {
    find( { wanted => \&process_file, no_chdir => 1 }, $dir ) or die $!;
}

sub process_file {
    my $dummy = $_;
    if ( -f $dummy ) {
        my $filename = "//share16/TOOLS/report.txt";
        open( my $fh, '>>', $filename )
            or die "Could not open file '$filename' $!";
        my $last_mod_time = ctime( stat($dummy)->mtime );
        print $fh "$last_mod_time $dummy\n";
    }
    close $fh;
}

脚本成功列出了第一个目录X下所有文件夹(文件夹1,文件夹2)下的文件,但在开始读取文件夹Y时立即失败。

错误:\ share16 \ traverse4.pl第5行没有此类文件或目录。

我无法理解它失败的原因,因为我尝试在dir_regex中对foldername进行硬编码,但在列出第一个目录下的文件后仍然失败。

1 个答案:

答案 0 :(得分:2)

因为您设置no_chdir所以find不会chdir。因此,您的各种调用 - 具有相对路径 - 失败。简单的解决方案是使用$File::Find::name而不是$_

我还要注意 - 您只需指定File::Find的目录列表 - 您不需要单独执行每个目录列表。