计算qr正则表达式中的捕获组?

Joe*_*ger 10 regex perl capture

我正在开发一个项目,它一次从ftp服务器获取文件列表.此时,它返回文件的arrayref,或者如果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;
  }
}
Run Code Online (Sandbox Code Playgroud)

此实现尝试创建哈希并在成功时返回它.我的问题是,我可以检测到它qr有一个捕获组,并且只是尝试创建哈希吗?

Qta*_*tax 18

你可以使用类似的东西:

sub capturing_groups{
    my $re = shift;
    "" =~ /|$re/;
    return $#+;
}

say capturing_groups qr/fo(.)b(..)/;
Run Code Online (Sandbox Code Playgroud)

输出:

2
Run Code Online (Sandbox Code Playgroud)

  • 让我看看我是否得到它:你匹配一个空字符串与任何东西或我的正则表达式的交替.没有什么可以匹配,但它仍然填充@ +,然后将捕获组的数量作为元素的数量.我对吗?非常聪明! (2认同)
  • (校正)...然后有一个元素而不是捕获(因为$ + [0]是匹配)但是因为$#+比元素数少一个,所以它返回正确的匹配数 (2认同)