2013-03-28 2 views
0

Ci-dessous est un script où j'essaie d'inverser puis de substituer (A => T, T => A, G => C, C => G).Subsitution simultanée en 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"; 

SORTIE:

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

global pour toutes les substitutions (version 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"; 

SORTIE:

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

Dans la première version, j'observe que les substitutions qui ne sont pas globales, sont substituées une fois (évidemment, puisque ce n'est pas global). Et dans la version 2, puisqu'il traite le code de haut en bas, la dernière substitution ignore le "G" restant. Je voulais toutes les substitutions en parallèle. Comment puis-je réaliser cela dans une chaîne?

Répondre

0

Si vous aviez use strict et use warnings en place, vous auriez vu l'avertissement

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

se référant à cette ligne

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

Je ne comprends pas ce que vous essayez de faire ici en dehors de l'inversion La chaîne À quoi sert la chaîne de saut de ligne de Newline? En outre, scalar est superflu et mettre la variable entre guillemets est faux (bien qu'aucune de ces erreurs n'affecte votre programme dans ce cas). Cela devrait être écrit

my $str_rev = reverse $str; 

Voici une solution montrant le bon code et en utilisant s/// au lieu de tr///. En dehors des corrections, c'est pour votre intérêt, car il est préférable d'utiliser translittérer.

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"; 

sortie

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

Y (transliterate) à la place:

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

Merci! Cela a fonctionné sans le "g";) – user1504209