我尝试在数据位置打印匹配的字符串,我该怎么办?
$at ="at";
@ar = <DATA>;
@xxv = map(m/$at/g, @ar);
print "@ar";
print @xxv;
print "\n";
__DATA__
atgacaagcagacccaggggatacgat
我预计输出
atgacaagcagacccaggggatacgat
at at at
答案 0 :(得分:6)
通过s///
$at ="at";
$ar = <DATA>;
print $ar;
$ar =~ s/$at(*SKIP)(*F)|./ /g;
print $ar;
__DATA__
atgacaagcagacccaggggatacgat
<强>输出:强>
atgacaagcagacccaggggatacgat
at at at
$at(*SKIP)(*F)
扩展变量$at
,并将存储在变量中的同一组字符与输入字符串进行匹配。在(*SKIP)(*F)
之后,匹配失败并强制|
右侧的模式与剩余字符匹配。所以.
匹配除跳过的字符以外的所有字符。用空格替换那些匹配的字符将为您提供所需的输出。
<强>参考文献:强>
答案 1 :(得分:1)
use warnings;
use strict;
my $at ="at";
my $ar ="atgacaagcagacccaggggatacgat";
(my $x = $ar) =~ s/./ /g;
substr($x, $-[0], $+[0]-$-[0]-1) = $at while $ar =~ /$at/g;
print "$ar\n$x\n";
根据您的评论,您似乎希望将结果打印到webbroser中。所以,当然,你需要一个非比例字体。要么你去
print "<pre>";
print "$ar\n";
print "$x";
print "</pre>";
或指定 monospace :
print "<div style='font-family:monospace'>");
print "$ar<br>";
print "$x";
print "</div>";
答案 2 :(得分:0)
您可以将split
与正则表达式一起使用,而不是map
。
$data = "atgacaagcagacccaggggatacgat" ;
my @chunks = split(/at/, $data) ;
print $data ; #echo input
#skip over non-matching chunks and print matches
foreach my $chunk (@chunks) {
print ' ' x length($chunk) ;
print 'at' ;
}
这将打印额外的&#39; at&#39;最后,但我懒得把它清理干净。
答案 3 :(得分:0)
@ user3384402以前的答案足以满足您的期望。
我认为您尝试对齐序列。在浏览器可视化中,空间不适合目标,这是你的问题。
只需简单,使用courier
或courier new
字体系列即可获得正确的视觉效果。生物信息学家在使用序列比对处理时仅使用这些字体。试试吧。