2012-04-14 17 views
2

ich auf einigen DNA gerade arbeite (A, T, C und G mit der Chance auf U geworfen)

Gerade jetzt habe ich eine wirklich lange Zeichenfolge voller DNA undefinierten Länge. Ich habe den Code für die Nukleotidbasen gemacht.

Jetzt alles, was ich tun muss, ist in eine Art von Schleife, um jedes einzelne Zeichen aus der Zeichenfolge zu lesen. Da dieser Code für Studenten gedacht ist, muss er einfach sein. Ich habe vor ein paar Wochen begonnen, Perl zu benutzen, Java davor.

Die Zeichenfolge ($ string1 heißt) muss ihren vollständigen Namen drucken, wenn jedes einzelne Basenpaar gelesen wird (einzeln). Also, wenn die Zeichenfolge sagt ATATCGCG

Die Ausgabe auf dem Bildschirm lesen muss: Adenin Thymin Adenin Thymin Cytosin Guanin Cytosin Guanin

Wenn dies zu schwierig aus einer Zeichenfolge zu tun Ich kann ein Array als Ausgangspunkt verwenden. Vielen Dank für deine Unterstützung.

Ausgezeichnete Antworten. Wir sind jetzt bereit. Die andere Frage, die ich hatte, war, sicherzustellen, dass der Benutzer nur DNA-Basen eingeben konnte (A, T, C & G). Ich denke, das nennt man Eingabevalidierung.

print "Please enter your first DNA sequence now: \n"; 
$userinput1=<>; 
chomp $userinput1; 

Wie würden Sie die Eingabevalidierung dort hinzufügen? Die erste Druckanweisung sollte immer erneut angefordert werden, sofern die Bedingungen nicht erfüllt sind.

Ich weiß, ich brauche so etwas wie

if($userinput1 ne 'a' or 't' or 'c' or 'g') { 
print "Please enter DNA only (A, T, C or G)"; 
} 

ich nicht ganz sicher bin, wie zum Original print-Anweisung, um wieder

Antwort

3

Mit dem Rezept Processing a String One Character at a Time, kam ich mit auf den Punkt:

 
use warnings; 
use strict; 

my %nucleotide_bases = (A => 'Adenine', 
      T => 'Thymine', 
      G => 'Guanine', 
      C => 'Cytosine'); 

my $string = 'ATATCGCG'; 
my @array = split(//, $string); 
foreach (@array) { 
    my $char = $_; 
    print $nucleotide_bases{$char}, ' '; 
} 

Beachten Sie, dass ich use warnings und use strict (die, als Anfänger, sollten Sie wahrscheinlich auch tun), so dass ich Zitate hinzufügen musste die Basisnamen. Außerdem druckt das Programm am Ende einen zusätzlichen Platz.

+1

Sie können 'for my $ char (split //, $ string)' verwenden, um sich ein wenig Tipparbeit zu ersparen und IMO Ihren Code klarer zu machen. – TLP

3

Ich nehme an, Sie versuchen, die verschiedenen Buchstaben A, T, G und C aus einer Zeichenfolge zu decodieren und ihren vollständigen Namen auszudrucken.

print "$nucleotide_bases{$_} " for split //, $string; 

Oder ein Array verwenden:

my @array = map $nucleotide_bases{$_}, split(//, $string); 
print "@array"; # quoted to insert spaces between elements. 

Als Alternative zu split, können Sie einen regulären Ausdruck verwenden, die von jedem nicht-relevanten Zeichen ausschließen decodiert werden:

my @array = $string =~ /[ATCG]/g; 

Oh, und wenn Sie Ihrem Hash Werte zuweisen, müssen Sie die Werte angeben. Netter Fang von Luke Girvin.

my %nucleotide_bases = (A => "Adenine", ...); 
0

Script:

#!/usr/bin/perl 

use strict; 
use warnings; 

my %nucleotide_bases = (A => 'Adenine', 
         T => 'Thymine', 
         G => 'Guanine', 
         C => 'Cytosine', 
         U => 'Uracil'); 

my $string1 = 'ATATCGCG'; 

$string1 =~ s/([ATGCU])/{$nucleotide_bases{$1}.' '}/ge; 

print $string1, "\n"; 

Ausgang:

Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine 
+0

Ausgezeichnete Antworten. Wir sind jetzt bereit. Die andere Frage, die ich hatte, war sicherzustellen, dass der Benutzer nur DNA-Basen eingeben konnte (A, T, C & G). Ich denke, das nennt man Eingabevalidierung. [CODE] print "Bitte geben Sie Ihre erste DNA-Sequenz jetzt ein: \ n"; $ userinput1 = <>; chomp $ userinput1; [/ CODE] Wie würden Sie die Eingabevalidierung dort hinzufügen? Die erste Druckanweisung sollte immer erneut angefordert werden, sofern die Bedingungen nicht erfüllt sind. Ich weiß, ich brauche so etwas wie [CODE [ if ($ userinput1 ne 'a' oder 't' oder 'c' oder 'g') – Shtanto

0

Bitte immeruse strict und use warnings am Anfang aller Ihrer Perl-Programme, vor allem diejenigen, die Sie Hilfe suchen. Auf diese Weise wird Perl viele einfache Fehler beheben, die Sie nicht bemerkt haben, und Sie werden viel schneller Arbeitscode produzieren.

Dies kann sehr einfach getan werden, indem Sie die Zeichenfolge in Zeichen aufteilen, den Hash verwenden, um sie zu übersetzen, und sie dann wieder zusammenfügen.

Dieses Programm demonstriert die Idee. Beachten Sie, dass ich Code verlassen habe, der den Hash wie Sie ihn erstellt hat, einfach weil Sie es vielleicht so bevorzugen.

use strict; 
use warnings; 

my %nucleotide_bases = (
    A => 'Adenine', 
    T => 'Thymine', 
    G => 'Guanine', 
    C => 'Cytosine', 
); 
$nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA 

my $chain = 'ATATCGCG'; 

my $expand = join ' ', map $nucleotide_bases{$_}, split //, $chain; 

print $expand, "\n"; 

Ausgang

Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine 

bearbeiten

Wie gewünscht, ist dies eine Folge aus der Konsole zu lesen und solange die Sequenz wiederholen geliefert ungültig ist. Die Ausgabe ist identisch mit der des vorhergehenden Codes.

use strict; 
use warnings; 

my %nucleotide_bases = (
    A => 'Adenine', 
    T => 'Thymine', 
    G => 'Guanine', 
    C => 'Cytosine', 
); 
$nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA 

my $userinput1; 
while() { 
    print "Please enter your first DNA sequence now: "; 
    chomp ($userinput1 = uc <>); 
    last unless $userinput1 =~ /[^ATGC]/; 
    printf qq("$userinput1" is an invalid sequence\n); 
} 

my $expand = join ' ', map $nucleotide_bases{$_}, split //, $userinput1; 

print $expand, "\n"; 
+0

Ausgezeichnet! Du hast vielleicht die Welt gerettet - Danke :) – Shtanto