我不太喜欢 File::Find。它就是行不通right. The find
命令不会返回文件列表,因此您必须使用非本地的你的数组变量find
捕获您找到的文件列表(不好),或者将整个程序放入您的wanted子例程(甚至更糟)。另外,单独的子例程意味着您的逻辑与您的逻辑是分开的find
命令。实在是太丑了。
我所做的是内联我的wanted
我里面的子程序find
命令。子例程与查找保持一致。另外,我的非本地的数组变量现在只是我的一部分find
命令并且看起来没那么糟糕
这是我的处理方式File::Find
-- 假设我想要的文件具有.pl
suffix:
my @file_list;
find ( sub {
return unless -f; #Must be a file
return unless /\.pl$/; #Must end with `.pl` suffix
push @file_list, $File::Find::name;
}, $directory );
# At this point, @file_list contains all of the files I found.
这与以下完全相同:
my @file_list;
find ( \&wanted, $directory );
sub wanted {
return unless -f;
return unless /\.pl$/;
push @file_list, $File::Find::name;
}
# At this point, @file_list contains all of the files I found.
内衬看起来更好。而且,它将我的代码放在一起。另外,我的非本地的数组变量看起来并不那么奇怪。
我也喜欢利用shorter以这种特殊方式的语法。通常,我不喜欢使用推断$_
,但在这种情况下,它使代码更容易阅读。我原来的通缉是这样的:
sub wanted {
my $file_name = $_;
if ( -f $file_name and $file_name =~ /\.pl$/ ) {
push @file_list, $File::Find::name;
}
}
File::Find
使用起来不是那么棘手。你只需要记住:
- 当您找到不需要的文件时,可以使用
return
转到下一个文件。
-
$_
包含不带目录的文件名,您可以使用它来测试文件。
- 该文件的全名是
$File::Find::name
.
- 该文件的目录是
$File::Find::dir
.
而且,最简单的方法是将所需的文件推送到数组中,然后在程序中稍后使用该数组。