2013-03-28 58 views
0

下面是一個腳本,我試圖反轉並替換(A => T,T => A,G => C,C => G)。Perl中的同步替換

VERSION 1

#!/usr/bin/perl  
my $str="AAAAAGCTTGC"; 
$str_rev=scalar reverse ("$str"),"\n"; 
print"My original string: $str\n"; 
print "My reversed string: $str_rev\n"; 

$str_rev =~ s/A/T/g; 
$str_rev =~ s/T/A/; 
$str_rev =~ s/G/C/g; 
$str_rev =~ s/C/G/; 
print"My substituted reversed string: $str_rev\n"; 

OUTPUT:

My original string: AAAAAGCTTGC 
My reversed string: CGTTCGAAAAA 
My substituted reversed string: GCATCCTTTTT 

全球所有置換(第2版)

$str_rev =~ s/A/T/g; 
$str_rev =~ s/T/A/g; 
$str_rev =~ s/G/C/g; 
$str_rev =~ s/C/G/g; 
print"My substituted reversed string: $str_rev\n"; 

OUTPUT:

My original string: AAAAAGCTTGC 
My reversed string: CGTTCGAAAAA 
My substituted reversed string: GGAAGGAAAAA 

在第一個版本中,我觀察到不是全局的替換正在被替換一次(顯然,因爲它不是全局的)。在版本2中,由於它自上而下處理代碼,所以最後一個替換會跳過剩餘的「G」。我想要所有的替代品並行。我怎樣才能在一個字符串中實現呢?

回答

0

如果你有在地方use strictuse warnings你會看到警告

Useless use of a constant ("\n") in void context 

參照此行

$str_rev=scalar reverse ("$str"),"\n"; 

除了逆轉t之外,我不明白你在做什麼他串。什麼是雜散的換行字符串?另外,scalar是多餘的,並將變量放在雙引號中是錯誤的(儘管在這種情況下這些錯誤都不會影響您的程序)。本應寫入

my $str_rev = reverse $str; 

這裏是表示正確的代碼,並使用s///代替tr///的溶液。除了修復之外,這是爲了您的興趣,因爲最好使用音譯。

use strict; 
use warnings; 
use 5.014; 

my $str = "AAAAAGCTTGC"; 

print "My original string: $str\n"; 

my %map = (A => 'T', T => 'A', G => 'C', C => 'G'); 
my $str_rev = reverse $str =~ s/([ATGC])/$map{$1}/gr; 

print "My substituted reversed string: $str_rev\n"; 

輸出

My original string: AAAAAGCTTGC 
My substituted reversed string: GCAAGCTTTTT 
8

使用Y(音譯),而不是:

$str_rev =~ tr/ATGC/TAGC/; 
+0

謝謝!它工作 - 沒有「g」;) – user1504209 2013-03-28 09:39:58