2014-12-05 44 views
0

假设$dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt"如何匹配字符串(一行)相同的模式,并执行相同的操作再次

我想在你的字符串 每个AAAA & CCCC之间削减,换上新的生产线。例如,我想

aaaa 
ccccttttaaaaggggaaaa 
cccccaaaaggggaaaa 
cccctttttttt 

我的代码:

if ($DNA =~ /(.*)$match(.*)/) { # $match would be aaaacccc together 
       my $fragment1 = $1.$pre-match; # pre-match is aaaa 
       my $fragment2 = $post-match.$2; # post-match is cccc 
       print"$fragment1\n$fragment2\n"; 

我想每场比赛削减。

非常重要的是,只有在赛后才能切断dna。必须有一场预赛

让我知道我做错了什么。谢谢

回答

1

这会做你想要什么:

$dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt"; 
$dna =~ s/(.*?)(cccc.*?)/$1\n$2/g; 

print "$dna\n"; 

正则表达式将每前cccc

输出,增加一个新行:

aaaa 
ccccttttaaaaggggaaaa 
cccccaaaaggggaaaa 
cccctttttttt 
+0

干得漂亮!你们好棒!!!非常感谢你!!! – 2014-12-05 10:35:03

+0

不客气!如果您发现它有用,请将答案标记为[accepted](http://stackoverflow.com/help/someone-answers)。 – arco444 2014-12-05 10:38:38

+0

我建议'/ r'标志也是一种非破坏性的解决方案。 '说$ dna =〜s /(。+?)(cccc。+?)/ $ 1 \ n $ 2/gr;'只适用于更新的版本。 – 2014-12-05 10:52:56

0

一种解决方案是拆分字符串和加入"\n"

use warnings; 
use strict; 
use 5.01; 

my $dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt"; 
my ($split_left, $split_right) = ('aaaa','cccc'); 

say join "\n", split /(?<=$split_left)(?=$split_right)/, $dna; 

匹配和预匹配是perl中的预定义术语,意味着最后一次匹配前后的整个字符串(您可以通过/p标志通过${^PREMATCH}${^POSTMATCH}访问它们)。另外,perl中的变量名不能包含-,因为它是一个运算符,请使用_或camelCasing。

0

我觉得simplist方式是与替代添加换行符:

$dna =~ s/aaaacccc/aaaa\ncccc/g; 
相关问题