如果您已经在使用find,我不会打扰glob
。还不如简单地找到想要的文件,并删除它们:
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
函数使用两个特殊的package variables,$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
看起来更清洁。
[为什么我的Perl脚本失败的“〜/”,而是以“$ ENV {HOME}”的作品?] (http://stackoverflow.com/questions/976968/why-does-my-perl-script-fail-on-but-works-with-envhome) – devnull