glob
如果您已经在使用 find ,我不会打扰。不妨简单地找到您想要的文件并删除它们:
use strict;
use warnings;
use File::Find;
use Env qw(HOME);
use constant {
SUFFIX_LIST => qr/\.(log|foo|bar)$/,
DIR_TO_CHECK => $HOME,
};
@file_list;
find ( sub {
return unless -f;
return unless $_ ~= SUFFIX_LIST;
push @file_list, $File::Find::name;
}, DIR_TO_CHECK );
unlink @file_list;
我已经定义了一个正则表达式(即qr/.../
),它定义了我感兴趣的后缀列表。我将常量设置SUFFIX_LIST
为这个正则表达式。如果我的文件名与我的正则表达式匹配,那么它就是我要删除的文件。
我定义一个@file_list
我做的主要是出于习惯和工作方式find
。我不是一个大find
粉丝,但这就是我们所拥有的。问题是find
希望您的所有代码都包含在find
子例程中,这是一种不好的做法。为了解决这个问题,我find
将我想要的子程序推送到一个数组中,然后对该数组进行操作。
在这个特定的程序中,我本可以做unlink
的,find
因为它太短了。然而,大多数时候,你最好使用这种技术。
该find
函数使用两个特殊的包变量和。第一个是带有完整路径的文件的名称,以提供给命令的目录名称开头。第二个是目录的名称(完整路径)。该函数还设置为当前文件名。因为实际上是在文件所在的目录中,上面没有目录名,可以用来测试文件。$File::Find::name
$file::Find::dir
find
find
$_
find
$_
我做了两个测试:1)。这是一个文件吗?和2)。此文件的名称是否以我感兴趣的后缀之一结尾。(请注意,第一个,我可以简单地使用unless -f
,而第二个,我必须指定$_
变量。)。
如果该文件是一个文件并且具有正确的后缀,我将它推送到我的@file_list
数组中。
我更喜欢将我想要的子程序嵌入到我的find
命令中。它将函数与影响它的代码保持在一起。以下两个是等价的:
find ( sub {
return unless -f;
return unless $_ ~= SUFFIX_LIST;
push @file_list, $File::Find::name;
}, DIR_TO_CHECK );
和
find (\&wanted, DIR_TO_CHECK );
sub wanted {
return unless -f;
return unless $_ ~= SUFFIX_LIST;
push @file_list, $File::Find::name;
};
我将常量用于真正是常量的事物。这是一个很好的编程习惯。Perl 常量有点古怪,因为它们没有标记。因此,当您在可能与字符串混淆的情况下使用它们时,您必须小心。
我还使用use Env
拉入我想要定义的环境变量,并且只有那些。我可以通过$ENV{HOME}
构造将它们拉进来。这取决于您的喜好。该$ENV{..}
构造清楚地表明您正在引入环境变量。use Env
看起来更干净。