2014-12-05 42 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; 
相關問題