2009-04-28 7 views
2

Ich benutze Perl für ein Skript, das Eingabe als zwei kurze DNA-Stränge aufnimmt. Als eine Ausgabe verkette ich die zwei Zeichenketten-Zeichenketten und drucke dann die zweite Zeichenkette, die über ihrer Kopie am Ende der verketteten Zeichenkette aufgereiht ist. Zum Beispiel: Wenn Eingabestring ist AAAA und TTTTT dann Druck:Warum macht Perl's /// was ich will?

AAAAATTTTT 
    TTTTT 

Ich weiß, es gibt auch andere Möglichkeiten, dies zu tun, aber ich bin neugierig, warum meine Verwendung tr /// funktioniert nicht.

Der Code für das Programm ist:

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

Ist das nur schlecht formatiert oder sieht Perls Syntaxformat tatsächlich so aus? –

+0

ist nicht "$ DNA1 = ~ s/\ r? \ N? $ //;" das gleiche wie "chomp $ DNA1"? –

+0

ja "$ DNA1 = ~ s/\ r? \ N? $ //;" ist das gleiche wie "chomp $ DNA. aber Perl 4 und niedrigere Versionen nicht chomp unterstützen, so ist es eine Alternative. und meine Maschine hat Perl 4 installiert. – shubster

Antwort

1

Ihr tr ändert jeder ACTGatcg und entfernt sie. Ich denke du willst

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

eigentlich ohne das Leerzeichen macht der tr-Befehl nichts – Alnitak

+0

nicht nichts, es zählt sie (aber die zurückgegebene Anzahl ist hier nicht verwendet) – ysth

1

Sie benötigen einen Platz in der zweiten Hälfte des tr Befehl setzen.

Alternativ scheint es, dass, was Sie versuchen, eine Variable zu tun schaffen so viele Felder enthält, wie Zeichen in der ersten Saite waren:

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

rofl, es dauerte ewig, nur um den "tr" -Befehl zu finden ... –

1

Es könnte nur ein einfacher Syntaxfehler sein. Versuchen:

$DNA3 =~ tr/ATCGatcg/ /; 

, wo der zweite Schrägstrich Ihre zwei Übersetzungseinheiten trennt, und Sie haben ein Leerzeichen zwischen den zweiten und dritten Schrägstrichen.

Viel Glück!

Edit: mein Fehler - missverstanden, was Sie tun wollten. Antwort entsprechend angepasst :)

0

Ist das das Programm, das Sie wollen?

 
#!perl 

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

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