Ich habe eine DNA-Sequenz. Nennen wir es "ATCG". Ich habe 2 kleine Datenbanken von DNA-Sequenzen in 2 separaten Dateien, die wir "db1.txt" und "db2.txt" nennen. Beide Datenbanken sind wie folgt formatiert:Perl: Zuweisen einer Variablen einen von 3 möglichen Werten
>name of sequence
EXAMPLESEQUENCEATCGATCG
>name of another sequence
ASECONDEXAMPLESEQUENCEATCGATCG
Ich möchte wissen, ob meine DNA-Sequenz in einer der Datenbanken enthalten ist, und wenn ja, welche. Mein Ergebnis hat dann 3 mögliche Werte: Meine Sequenz befindet sich weder in der Datenbank, noch in db1 oder in db2. Hier ist mein Code:
use warnings;
use strict;
my $entry = 'ATCG';
my $returnval = "The sequence is from neither database";
#if in db1
my $name1;
my $seq1;
open (my $database1, "<", "db1.txt") or die "Can't find db1";
while (<$database1>){
chomp ($name1 = <$database1>);
chomp ($seq1 = <$database1>);
if (
index($seq1, $entry) != -1
|| index($entry, $seq1) != -1
) {
$returnval = "The sequence is from db1: ". $name1;
last;
}
}
#If in db2:
my $name2;
my $seq2;
open (my $database2, "<", "db2.txt") or die "Can't find db2";
while (<$database2>){
chomp ($name2 = <$database2>);
chomp ($seq2 = <$database2>);
if(
index($seq2, $entry) != -1
|| index($entry, $seq2) != -1
) {
$returnval = "The sequence is from db2: ". $name2;
last;
}
}
print $returnval . "\n";
Es gibt ein paar Probleme mit diesem Code (wahrscheinlich mehr als ein paar). Egal was meine Sequenz ist, $ returnval = "Die Sequenz ist von db2:" ohne Namen am Ende. Darüber hinaus scheinen $ name2 und $ seq2 nicht initialisierte Werte zu sein, obwohl der Code identisch mit dem von db1 ist. Wenn ich den gesamten Abschnitt zum Testen für db2 entferne, gibt der Code nur "die Sequenz stammt von db1:" gefolgt von dem entsprechenden Namen für einige Sequenzen, die ich kopiert und aus der Datenbank eingefügt habe, zurück Datenbank "für andere.
Was mache ich falsch? Wie behebe ich die nicht initialisierten Werte und warum funktioniert der Code für db2 nicht?
EDIT: Ich habe vergessen zu erwähnen, dass die Ausgabe, dass die Sequenz in db2 ist, Vorrang vor der Ausgabe hat, dass es in db1 ist, sollte eine Sequenz in beiden sein.
Das sollte nicht einmal kompilieren. '$ name' ist nicht deklariert. – melpomene
Dies ist nicht der eigentliche Code.Ich habe die relevanten Teile herausgenommen und einige Variablen umbenannt, um das Lesen zu erleichtern. –
Sie lesen eine Zeile mit dem 'while (<', zweite Zeile mit '$ nameX = <', dritte Zeile mit '$ seqX = <'. Sie müssen lese zwei Zeilen, nicht drei pro Wiederholung – choroba