2012-11-27 9 views
0

我試圖音譯DNA串生成下列方式反向互補...然後使用所產生的輸出模式音譯在Perl

$revcomp = reverse($dna);

$revcomp =~ tr/ACGTacgt[]{}N/TGCAtgca][}{./;尋找比賽在一個大的DNA串

例如: 如果這是我的輸入字符串,

C[AG]{7,10}[ACGT]{5,8}ATGC

,我想我的輸出是

GCAT[ACGT]{5,8}[CT]{7,10}G

但是,我最終得到的是:GCAT{8,5}[ACGT]{01,7}[CT]G

任何幫助?

+0

所以你真的試圖扭轉正則表達式 – ErikR

+3

你的問題是,你試圖通過倒車的原子,它不工作,扭轉了「模塊化」的表達。您需要識別表達式的每個文字部分,例如'C','[AG] {7,10}','[ACGT] {5,8}'和'ATGC',然後反轉和音譯。識別所有可能的正則表達式元字符可能相當棘手。 – TLP

回答

3

我不知道您正在使用的DNA字符串表示形式,但此代碼適用於您的數據。

它在DNA字符串中查找單個項目,其中項目可以是一個或多個基序的序列,或者是方括號中的序列,後面跟着一對大括號中的重複計數。我假設永遠不會只有一個重複計數,但如果這是可能的話,這個代碼很容易修改。

use strict; 
use warnings; 

my $seq = 'C[AG]{7,10}[ACGT]{5,8}ATGC'; 
my $rev = ''; 

while (1) { 
    if ($seq =~ /\G([ATGC]+)/igc) { 
    (my $new = reverse $1) =~ tr/ACGTacgt/TGCAtgca/; 
    $rev = $new.$rev; 
    } 
    elsif ($seq =~ /\G\[([ATGC]+)\]\{(\d+),(\d+)\}/igc) { 
    (my $new = reverse $1) =~ tr/ACGTacgt/TGCAtgca/; 
    $rev = "[$new]{$2,$3}".$rev; 
    } 
    else { 
    last; 
    } 
} 

print $rev; 

輸出

GCAT[ACGT]{5,8}[CT]{7,10}G