假设您已解析配置文件以获取扩展名和忽略目录的列表,则可以将正则表达式构建为字符串,然后使用qr
运算符将其编译为正则表达式:
my @extensions = qw(avi flv mp3 mp4 wmv); # parsed from file
my $pattern = '\.(' . join('|', @wanted) . ')$';
my $regex = qr/$pattern/;
if ($file =~ $regex) {
# do something
}
编译并不是绝对必要的;您可以直接使用字符串模式:
if ($file =~ /$pattern/) {
# do something
}
目录有点困难,因为有两种不同的情况:全名和后缀。您的配置文件必须使用不同的键来明确哪个是哪个。例如“dir_name”和“dir_suffix”。对于全名,我只需构建一个哈希:
%ignore = ('.svn' => 1);
带后缀的目录可以按照与文件扩展名相同的方式完成:
my $dir_pattern = '(?:' . join('|', map {quotemeta} @dir_suffix), ')$';
my $dir_regex = qr/$dir_pattern/;
您甚至可以将模式构建到匿名子例程中以避免引用全局变量:
my $file_filter = sub { $_ =~ $regex };
my $descend_filter = sub {
! $ignore{$File::Next::dir} &&
! $File::Next::dir =~ $dir_regex;
};
my $iter = File::Next::files({
file_filter => $file_filter,
descend_filter => $descend_filter,
}, $directory);