2013-03-28 2 views
0

Ниже приведен сценарий, в котором я пытаюсь изменить, а затем подставить (A => T, T => A, G => C, C => G).Синхронная подстановка в Perl

версия 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"; 

ВЫВОД:

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

Global для всех замен (версия 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"; 

ВЫВОД:

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

В первой версии я заметил, что подстановка, которая не является глобальной, подменяются один раз (очевидно, поскольку ее не глобальная). А в версии 2, поскольку он обрабатывает код сверху вниз, последняя подстановка пропускает оставшуюся «G». Я хотел все подстановки параллельно. Как я могу добиться этого в строке?

ответ

0

Если у вас use strict и use 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

Используйте у (транслитерация) вместо:

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

Спасибо! Он работал - без «g»;) – user1504209

Смежные вопросы