Вам не нужно умное сопоставление здесь. ~~ с одним регулярным выражением в правой части и строкой в левой части также может быть = ~, как и у вас. Что ты пытаешься сделать?
Для вашего матча у вас есть два пути. Если вы хотите использовать строку в качестве шаблона, вам нужно использовать оператор соответствия:
basename($subdir) =~ m/$regex/
Если вы не хотите использовать оператор сопоставления, как сейчас, вам нужен объект регулярного выражения:
my $regexes_to_filter_a = (qr/tmp/, qr/temp/, qr/del/);
Полагаю, вы могли бы сопоставить все регулярные выражения одновременно. Обратите внимание, что если вы собираетесь установить maxdepth на 1, вам не нужен File :: Find :: Rule. Если вы не собираетесь обходить структуру каталогов, не используйте модуль, предназначенный для обхода структуры каталогов:
my $regexes_to_filter_a = (qr/tmp/, qr/temp/, qr/del/);
my @organism_dirs = ();
foreach my $subdir ( glob( '*' ) ) {
next unless -d $subdir;
unless (basename($subdir) ~~ @regexes_to_filter_a) {
push @organism_dirs, $subdir;
}
}
Я думаю, что все это слишком много работы, хотя. Если вы хотите исключить известные статические имена каталогов (а не шаблоны), просто используйте хеш:
my %ignore = map { $_, 1 } qw( tmp temp del );
my @organism_dirs =
grep { ! exists $ignore{ basename($_) } }
glob( "$rootdir/*" );
Если вы действительно хотите использовать умный матч:
my %ignore = map { $_, 1 } qw( tmp temp del );
my @organism_dirs =
grep { basename($_) ~~ %ignore }
glob( "$rootdir/*" );