Я работаю над проектом, который в какой-то момент получает список файлов с ftp-сервера. В этот момент он либо возвращает arrayref файлов, либо если передана необязательная ссылка regex (т.е. qr
), она фильтрует список вниз с помощью grep. Кроме того, если qr
имеет группу захвата, он обрабатывает захваченный раздел как номер версии и возвращает вместо него hashref, где ключи являются версиями, а значениями являются имена файлов (которые были бы возвращены как массив, если нет захвата группы). Код выглядит (слегка упрощен)
sub filter_files {
my ($files, $pattern) = @_;
my @files = @$files;
unless ($pattern) {
return \@files;
}
@files = grep { $_ =~ $pattern } @files;
carp "Could not find any matching files" unless @files;
my %versions =
map {
if ($_ =~ $pattern and defined $1) {
( $1 => $_ )
} else {
()
}
}
@files;
if (scalar keys %versions) {
return \%versions;
} else {
return \@files;
}
}
Эта реализация пытается создать хэш и возвращает ее, если она преуспевает. Мой вопрос: могу ли я обнаружить, что qr
имеет группу захвата и только пытается создать хэш, если он делает?