2012-08-02 39 views
0

在perl腳本中,我需要替換多個字符串。目前,我使用:Perl以不同的方式替換每個出現

$fasta =~ s/\>[^_]+_([^\/]+)[^\n]+/\>$1/g; 

目的是在FASTA文件中格式化每個序列名稱。它適用於我的情況,所以我不需要觸摸這部分。但是,恰巧在文件中多次出現序列名稱。我不能在最後兩次 - 或更多 - 相同的序列名稱。因此,我需要有例如:

seqName1 
seqName2 
etc. 

(而不是seqname的,seqname的,等等)

這是可能以某種方式處理不同的自動每次出現?我不知道有多少序列,如果有相似的名字,等等。一個想法是在每次出現時連接一個隨機字符串,因此我的問題。

非常感謝。


約翰完美解決它,chepner與聰明的主意有助於避免衝突,這裏是最後的結果:

$fasta =~ s/\>[^_]+_([^\/]+)[^\n]+/ 
    sub { 
     return '>'.$1.$i++; 
    }->(); 
/eg; 

很多很多的感謝。

+0

檢查Perl是否允許您傳遞函數來處理替換。 – nhahtdh 2012-08-02 15:02:46

+0

我徒然試圖在正則表達式中添加一個「rand(999)」。正則表達式中的文本被視爲文本,而不是代碼。 – Johy 2012-08-02 15:05:08

回答

4

我其實是試圖做這樣的事情有一天,這裏就是我想出了

$fasta =~ s/\>[^_]+_([^\/]+)[^\n]+/ 

    sub { 

     # return random string 

    }->(); 

/eg; 

\e修改解釋作爲替代代碼,而不是文字。我使用匿名代碼ref,以便我可以隨時返回。

+0

我不知道那個,非常感謝。我仍然需要保存序列名稱('$ 1')。有關如何仍然顯示它的任何想法?現在,我只能用一個完整的隨機字符串替換而不是部分字符串。 – Johy 2012-08-02 15:12:31

+0

您仍然可以在子程序 – 2012-08-02 15:14:25

+0

中使用'$ 1'這非常完美。 – Johy 2012-08-02 15:19:27

相關問題