Подсчитать группы захвата в регулярном выражении qr?

Я работаю над проектом, который в какой-то момент получает список файлов с ftp-сервера. В этот момент он либо возвращает ссылку на массив файлов, либо, если передается необязательная ссылка на регулярное выражение (например, qr ), он фильтрует список вниз с помощью grep. Кроме того, если этот qr имеет группу захвата, он обрабатывает захваченный раздел как номер версии и вместо этого возвращает хэш-ссылку, где ключи - это версии, а значения - имена файлов (которые были бы возвращены как массив, если нет групп захвата). Код выглядит (немного упрощен)

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 имеет группу захвата, и попытаться создать хэш только в том случае, если она есть?

10
задан cjm 28 December 2011 в 21:54
поделиться