2014-02-14 76 views
0

我有一個DNA串像如何將一組字母映射到perl中的另一組?

tcatttcaaatcatctggaccaaaagagtcaggaagtaactcttctatcgttttcatatcataacccccgt 
cgtcatgaaacatataaacatttatatccttcgaaaattcacgaattacttgacgacaaataccacagggc 
gtaactcttcccttggcactcatcactccaatagccataaatttagtgtaacccatgctcactgcttttgt 
aattgctactcgttcggcacagatgcaattgccatatgatgcgttttcaacattagctccataaatatatg 
tatttttatcgtcggatactacgcatgcacctactgcgaagttggagtagggacaatatgaatattgtaaa 
ctctcttttacttcttgaaataacttctcaatatcttctttttccat 

(除了一個長結實,沒有休息)

現在我要全部更換attacggc我如何使用正則表達式?

+2

看看Perl翻譯運算符'tr //' – Paul

+1

你爲什麼要「用正則表達式來做它」?正如保羅在評論中和史蒂夫在他的回答中所說的那樣,「tr ///」更適合。 – ruakh

+0

這個問題會對你有所幫助。 http://stackoverflow.com/questions/3638205/whats-the-difference-between-tr-and-s-when-using-regex-in-perl – JackXu

回答

2

你可以使用一個子程序:

sub complement { 

    my ($seq) = @_; 

    $seq =~ tr/ACGTacgt/TGCAtgca/; 

    return $seq; 
} 

,並調用它像:

my $complemented_string = complement($string); 
+1

既不是'sub',也不是錯位的'scalar'或者'reverse'在這裏是相關的,只有'tr ///'操作符。 – amon

+1

請注意'scalar $ seq'實際上是一個no-op。你可能意思是'標量反向......' – amon

+0

是的,對不起那個!固定。 – Steve

2

您應該清楚地提出你的問題成爲可能。要求使用正則表達式的解決方案誤導每個人。

自從Perl 5中的14版,你可以在tr///修改字符串,而不是改變就地值使用/r修改。如果你想保留原始和倒轉的DNA序列,這可能是最好的解決方案。

這個簡短的程序顯示了一個例子。請注意,tr/// doe 而不是使用正則表達式。使用

use strict; 
use warnings; 
use 5.014; 

my $seq = 'tcatttcaaatcatctggaccaaaagagtcaggaagt'; 
my $inv = $seq =~ tr/atcg/tagc/r; 

say $seq; 
say $inv; 

輸出

tcatttcaaatcatctggaccaaaagagtcaggaagt 
agtaaagtttagtagacctggttttctcagtccttca 
+0

+1這太聰明瞭! – Steve

0

shell命令tr直接,如果你想嘗試一下。

tr "atcg" "tagc" < file 
相關問題