2009-04-28 7 views
2

J'utilise Perl pour un script qui prend en entrée deux courtes chaînes d'ADN. En sortie, je concatène les deux chaînes de caractères puis j'imprime la deuxième chaîne alignée sur sa copie à la fin de la chaîne concaténée. Par exemple: si la chaîne d'entrée sont et TTTTT puis AAAA print:Pourquoi Perl n'est pas /// faire ce que je veux?

AAAAATTTTT 
    TTTTT 

Je sais qu'il ya d'autres façons de le faire, mais je suis curieux de savoir pourquoi mon utilisation de tr /// ne fonctionne pas.

Le code du programme est:

use strict; 
use warnings; 
print "enter a DNA sequence \n"; 
$DNA1=<>; #<> shorthand for STDIN 
$DNA1=~ s/\r?\n?$//; 
print $DNA1 "\n\n"; 
print "enter second DNA sequence \n"; 
$DNA2=<>; 
$DNA2=~ s/\r?\n?$//; 
print $DNA2 "\n\n"; 
$DNA= join("",($DNA1,$DNA2)); 
print "Both DNA sequences are \"$DNA\" \n\n"; 
$DNA3=$DNA1; 
$DNA3=~ tr/ATCGatcg//; 
print $DNA3 "\n\n"; 
$DNA4= join("",($DNA3,$DNA2)); 
print $DNA4 "\n\n"; 
exit; 
+0

Est-ce que c'est juste mal formaté ou le format de syntaxe de Perl ressemble-t-il à ceci? –

+0

n'est pas "$ DNA1 = ~ s/\ r? \ N? $ //;" la même chose que "chomp $ DNA1;"? –

+0

oui "$ DNA1 = ~ s/\ r? \ N? $ //;" est la même chose que "chomp $ DNA" mais perl 4 et versions inférieures ne supportent pas chomp donc c'est une alternative et ma machine a installé perl 4. – shubster

Répondre

1

Votre tr change tout de ACTGatcg et les supprime. Je pense que vous voulez

$DNA3 =~ tr/atcgATCG/ /; 
+0

réellement sans l'espace la commande tr ne fait rien – Alnitak

+0

pas rien, ça compte (mais le compte retourné n'est pas utilisé ici) – ysth

1

Vous avez besoin de mettre un espace dans la seconde moitié de la commande tr.

Sinon, il semble que ce que vous essayez de faire est de créer une variable contenant autant d'espaces qu'il y avait de caractères dans la première chaîne:

my $spaces = ' ' x length($DNA1); 
+0

rofl, il m'a fallu une éternité juste pour trouver la commande "tr" ... –

1

Il peut s'agir d'une simple erreur de syntaxe. Essayez:

$DNA3 =~ tr/ATCGatcg/ /; 

où la deuxième barre oblique sépare vos deux entités de traduction, et vous avez un espace entre les deuxième et troisième barres obliques.

Bonne chance!

Modifier: mon erreur - mal compris ce que vous vouliez faire. Réponse ajustée en conséquence :)

0

Est-ce le programme que vous voulez?

 
#!perl 

my $s1 = 'AAAAAAAAA'; 
my $s2 = 'TCGAGCTA'; 

print 
    $s1, $s2, "\n", 
    ' ' x length($s1), $s2, "\n"; 
Questions connexes