【发布时间】:2018-01-29 19:50:30
【问题描述】:
我有以下代码成功地将所有与我的正则表达式匹配的字符串打印到控制台 (perl myscript.pl sample_text.txt)。
$filename=shift;
open text, $filename or die "error opening $filename\n";
while (my $line = <text>) {
push @matches, $1 while $line
=~ m{
(( [ACGT]{6} )
CTGA
[ACGT]
GAG
( [ACGT]{3,6} )
[ACGT]{2,100}
(??{ $3 =~ tr/ACGT/TGCA/r })
( CGAAA[ACGT] ))
}xgi;
}
print "$_\n" for @matches;
(这只是我的正则表达式的简化版本,我的捕获组要复杂得多,并且没有固定长度。)
我的sample_text可以下载here。
我希望输出保持原样(每行一个匹配项),但我希望与 first ( [ACGT]{6} ) 和 last @ 匹配的子字符串987654326@ 在我的正则表达式中捕获组,以便在控制台中打印整个匹配时在它们周围加上括号。
举个例子,当我在附加的示例文件 (sample_text) 上运行上面的整个脚本时,我得到的匹配结果之一是:
TTTATGCTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTTCGAAAA
我反而想看到这样的输出:
(TTTATG)CTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTT(CGAAAA)
【问题讨论】:
-
总是将
$!variable添加到错误消息中以查看原因,... or die "... : $!\n"; -
词法文件句柄更好,
open my $fh, ....; while (my $line = <$fh>) { }
标签: regex perl capture-group