Предполагая, что вы проанализировали файл конфигурации, чтобы получить список расширений и игнорируемых каталогов, вы можете построить регулярное выражение в виде строки, а затем использовать оператор 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);