如何在 Perl 的整个匹配输出中突出显示捕获组(例如,用括号括起来)

How to highlight capture groups (e.g. with brackets around them) in the entire match output in Perl

我有以下代码,它成功地将所有与我的正则表达式匹配的字符串打印到控制台 (perl myscript.pl sample_text.txt)。

$filename=shift;
open text, $filename or die "error opening $filename\n";

while (my $line = <text>) {
    push @matches,  while $line
        =~ m{
          (( [ACGT]{6} )
          CTGA
          [ACGT]
          GAG
          ( [ACGT]{3,6} )
          [ACGT]{2,100}
          (??{  =~ tr/ACGT/TGCA/r })
          ( CGAAA[ACGT] ))
        }xgi;
}

print "$_\n" for @matches;

(这只是我的正则表达式的简化版本,我的捕获组要复杂得多,而且没有固定长度。)

我的sample_text可以下载here.

我希望输出保持原样(每行一个匹配),但我想要匹配 first ( [ACGT]{6} ) 和 [= 的子字符串35=]last ( CGAAA[ACGT] ) 在我的正则表达式中捕获组,以便在控制台中打印整个匹配项时将它们括起来。

举个例子,当我 运行 上面的整个脚本在我附加的示例文件 (sample_text) 上时,我得到的匹配结果之一是:

TTTATGCTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTTCGAAAA

我反而想看到这样的输出:

(TTTATG)CTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTT(CGAAAA)

push @matches, "()()"
    while
        $line =~ m{
            ( [ACGT]{6} )
            ( CTGA
              [ACGT]
              GAG
              ( [ACGT]{3,6} )
              [ACGT]{2,100}
              (??{  =~ tr/ACGT/TGCA/r })
            )
            ( CGAAA [ACGT] )
        }xgi;

使用命名捕获:

#push @matches, sprintf "(%s)%s(%s)", @+{qw( pre main suf )}
push @matches, "($+{pre})$+{main}($+{suf})"
    while
        $line =~ m{
            (?<pre> [ACGT]{6} )
            (?<main> CTGA
              [ACGT]
              GAG
              ( [ACGT]{3,6} )
              [ACGT]{2,100}
              (??{ $^N =~ tr/ACGT/TGCA/r })
            )
            (?<suf> CGAAA [ACGT] )
        }xgi;