AAStylus Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 Hi, habe ein kleines Problem, hoffe bin richtig hier. Versuch mich seit kurzem in Perl einzuarbeiten. Nun wollte ich ein kleines Programm schreiben das aus einer angegebenen Textdatei die einzelnen Buchstaben (der text ist eine zeichenfolge ohne leerzeichen - DNA SEQUENZ) in einem Array speichert und diese dann in umgekehrter Reihenfolge wieder ausgibt. hab mir gedacht ich lese das ganze mit dem FILEHANDLE ein und suche dann in jeder Zeile nach einem A C T oder G (Nucleotidbasen)am Anfang, falls vorhanden soll er diese Zeilen nehmen da die Buchstaben einzeln speichern. Zum verständniss hier ein auszug aus der textdatei: Sequence 1771 BP; 527 A; 321 C; 423 G; 500 T; 0 other; gatcctgaca tgattttgaa attaaagatg ccgtttcaat cccagtaatg gcaaaagcaa gaattggcca ctttgtagaa gctcaggttt tagaatcaat tggcgtagat atgattgatg aaagtgaagt tttaacgcct gctgacgaaa taaaccacat aaataaaaaa gcatttacag caccatttgt ttgtggtgca agaaacttgg gcgaagcgtt aagaagaatt gatgaaggcg cagcaatgat aaggacaaaa ggcgaagctg gaactggaaa cgttgtagag gcagtaaaac aagctgaact tgttcaaatg gcaagaaacg aattaaaagt tccaatggaa ataatattgg aagttgcaaa attaaaaaga cttccagttg taaattttgc ggcaggaggc attgcaacac ctgctgatgc agcattaatg atgcaaatgg gctgtgatgg tgtatttgtt ggttcgggaa tttttaagtc gggaaatcct gaaatacggg caaaagcaat tgtagaggca acttataatt ttgataaacc agaattaatc ggggaagtaa gtaaaaattt aggggaagca atggttggaa taaatataga ccagattcct gaagaaatgc tccttgcaaa aagaggaatt taaattttta aactttaaat ttatttactt ttaaaatttt ttaaaacaaa tttttagatg ctaccgaaaa ctttatatat tataacacta gtattcagta tgcgaacaaa ttgcctcggt ggctcagcct ggtagagcgc ctgacttgta atcaggtggt cgggggttcg aatccccccc gaggcttgag ttacctttaa aagaggaaaa actcgttaaa aagggcctgt ggggtagcct ggtccatcct ttgggatttg ggatcctgag accccagttc aaatctgggc aggcccacca ttatttcccc gcgatagttc agattggtag aacggcggac tgtagatccg catgtcgctg gttcaaatcc ggctcgcggg atttaaatat cccctcatgg gcccgtagct tagtctggta gagcgcctga cttttaatca ggcggtcgag ggttcgaatc ccttcgggcc cgttcaaaac attaaatacg tttaggtatt gttttgatac ggcggtcata gcgggggtgt aacatccgat cccatcccga tctcggaaat taagccctcc agcgattcct taagtactgc tatctagtgg gaacaaggtg acgctgccga tcacttttta ttccaaatgc cctggtggtg tagctcggcc tatcatacag gactgtcact cctgtgactc gggttcaaat cccggccagg gcgctttgcg tcttttaaat aataaataat cagtattttg aaaaagccgt tatgggcccg tagcttagtc tggtagagcg cctgactttt aatcaggcgg tcgagggttc gaatcccttc gggcccgcta attttcgtat attaaaaatg ccctggtggt gtagctcggc ctatcataca ggactgtcac tcctgtgact cgggttcaaa tcccggccag ggcgcttttt tattttatgg aatgctaatt catatattta aatgtttatg tgaaaaaaat ggctaaagat ggcgaagtat tcaacttgat ttttgaaaga gggaattttt taaaaaatgt tattttaagc t Kurz: die Überschrift soll er auslassen und ab der zeile die keinen > am anfang hat soll er die Buchstaben abspeichern und in umgekehrter folge ausgeben. Ich weiss das es einfacher geht den text einfach als ganzes zu reversen aber das hat einen anderen Sinn für später... Hoffe ich habe halbwegs klarmachen können was ich meine :-s GRUSS AA Zitieren
Aiun Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 jop, ich denke ist verständlich. Aber wo ist dein Problem ?, was hast du bisher ? Zitieren
AAStylus Geschrieben 16. Dezember 2008 Autor Geschrieben 16. Dezember 2008 Hi, ehrlichgesagt nicht viel da ich nicht weiss wie ich die sache angehen soll. Hab nicht wirklich eine Vorgehensweise bzw Algorithmus nach dem ich mich richten sollte. Ich denk ich müsste erstmal mit einer Match anweisung die Zeilen suchen wo kein > am anfang steht bzw die die mit einem ACTG beginnen und bis zum nächsten leerzeichen andauern, das wäre dann die sequenz. Nur wie pack ich dann jeden einzelnen Buchstaben in einen Array? Und wie rufe ich die verkehrt herrum auf? Müsste ich nicht dafür für jede Sequenz vorher dafür sorgen das ich die genaue länge weiss für $_array[länge der Sequenz] oder kann man das irgendwie dynamischer mach in dem ich mit z.B $L=lenght... die länge für jede einzelne Sequenz ermittle und diese dann (z.B for (my $i=; 1 <= $L, i++ )[$i] einsetze... Wie gesagt bin anf#nger und mache das erst seit ein paar tagen.. Also bitte ich um Geduld mit mir :-) PS: Die von mir angegebene Sequenz oben beinhaltet leerzeichen. Ist aber nur ein Bsp. die eigentliche Sequenz hat aber keine! MFG AA Zitieren
bigvic Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 (bearbeitet) Hi, prinzipiell würde ich vorne anfangen. Klingt banal, ist aber wichtig. 1) Einlesen der Datei / Filehandle erzeugen open - perldoc.perl.org 2) Inhalt einlesen/bearbeiten http://www.perlfect.com/articles/perlfile.shtml 3) RegExp zum filtern perlrequick - perldoc.perl.org 4) Einlesen in Array perllol - perldoc.perl.org 5) Array manipulieren perlfaq4 - perldoc.perl.org Jetzt hau mal rein und dann kannst du ja die ersten Ergebnisse posten. ciao, vic Bearbeitet 16. Dezember 2008 von bigvic Zitieren
AAStylus Geschrieben 16. Dezember 2008 Autor Geschrieben 16. Dezember 2008 THX. wrd ich dann mal Posten :-) Zitieren
bytebrain Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 Als kleinen Tipp noch: Um einen String in seine Bestandteile zu zerlegen, ist die Funktion substr sehr hilfreich. Nur soviel noch dazu. Grüße, bytebrain Zitieren
DevilDawn Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 Um einen String in seine Bestandteile zu zerlegen, ist die Funktion substr sehr hilfreich. Um einen String in ein Array zu packen ist split() aber viel hilfreicher Zitieren
Mr Unix Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 hab mir gedacht ich lese das ganze mit dem FILEHANDLE ein und suche dann in jeder Zeile nach einem A C T oder G (Nucleotidbasen)am Anfang, falls vorhanden soll er diese Zeilen nehmen da die Buchstaben einzeln speichern. Das koenntest du so machen, aber die Frage ist ob du das auch wirklich willst. Ich kann mir vorstellen, dass sich dein Speicher bei groesseren Datenmengen sehr schnell fuellen kann. Das koennte etwa so aussehen: my @array; open(FILE, '<', $file) || die($!); while(<FILE>) { chomp; next unless m#^[actg]+\z#i; push @array, split("", $_); } close(FILE); print for reverse @array; Nur noch ein kleiner Tip am Rande: Ich hab 'ne Zeit lang mal mit BioPerl und Co gearbeitet. Da man da sehr oft an solchen Datensaetzen arbeiten muss, koennte es sich lohnen fuer tie() verschiedene Klassen zu bauen. Dann kannst du genau bestimmen, was in dem Array ist und wie es ausgegeben werden soll ohne den Originalinhalt zu verwerfen. mfg Unix Zitieren
bigvic Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 Man hilft den Menschen nicht, wenn man für sie tut, was sie selbst tun können. (Abraham Lincoln) Zitieren
Mr Unix Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 Man hilft den Menschen nicht, wenn man für sie tut, was sie selbst tun können. (Abraham Lincoln) »Die Haende, die Helfen sind weit besser als die Lippen, die predigen.« -- Robert Ingersoll Wir koennen uns hier bestimmt tausend Zitate und Meinungen an den Kopf schmeissen und ueber Hilfe zur Selbsthilfe diskutieren oder einfach zeigen wie man ein eher triviales Problem angehen koennte - darauf hab ich auch verwiesen: TIMTOWTDI. IMO ist die letzte Loesung, die Bessere. Wenn dem OP etwas daran liegt die Sprache zu verstehen, dann wird er sich den Code, meine Hinweise und deine Links zu Herzen nehmen. Lieber poste ich ab und an ein ansatzweise sauberes Beispiel mit Hinweisen, als das ich zum tausendsten Mal ein Skript lesen muss, in dem man Ausartungen wie "$array[$#array+1] = ..." findet. Ich erinnere mich genau an meine ersten Schritte: Ich war froh, wenn mir jemand nicht nur einen Link vor die Nase gelegt hat, sondern mir auch noch gleichzeitig gezeigt hat, wie man die Sache denn nun richtig anpackt. Das soll jetzt keineswegs zum Flamewar ausarten oder vom Topic ablenken; Nur ein kleiner Wink zu anderen Sichtweisen. Anregungen dazu nehm' ich gerne auch per PM entgegen. Wenn diese Art der Hilfe nicht erwuenscht sein sollte, dann kann ich meine Erfahrungen auch einfach fuer mich behalten (was IMO zumindest ein kleiner Verlust fuer die eh schon sehr kleine Perlgemeinde hier waere). mfg Unix Zitieren
unbenannt Geschrieben 19. Dezember 2008 Geschrieben 19. Dezember 2008 next unless m#^[actg]+\z#i; Dazu hätte ich zwei Fragen: 1. Wird ein regulärer Ausdruck automatisch auf $_ angewandt? 2. Was genau würde "\z" in diesem Ausdruck bewirken? Wenn ich nun richtig nachgelesen und hoffentlich verstanden habe, wird mit "\z" das absolute Stringende erkannt. Aber ich kann nicht nachvollziehen, wie es sich hier im Beispiel auswirken würde. Ich würde halt in diesem Fall eher das Dollarzeichen benutzen. Zitieren
Mr Unix Geschrieben 19. Dezember 2008 Geschrieben 19. Dezember 2008 1. Wird ein regulärer Ausdruck automatisch auf $_ angewandt? Wenn du keine Variable fuer den Regulaeren Ausdruck verwendest, dann wird (wie so oft) einfach von $_ ausgegangen. Das kann manchmal syntactic sugar sein, aber auch Probleme mit sich bringen, wenn man nicht auf den Kontext achtet: % perl -wle '$_="abc"; print $1 if m/(a)/' a % perl -wle '{local $_="abc";} print $1 if m/(a)/' Use of uninitialized value in pattern match (m//) at -e line 1. 2. Was genau würde "\z" in diesem Ausdruck bewirken? [...] Ich würde halt in diesem Fall eher das Dollarzeichen benutzen. Es bewirkt das Gleiche. Es steht fuer das Zeilenende. Was du hier verwendest, sei dir ueberlassen. Ich hatte mir vor langer Zeit \z angewoehnt, weil es von Activestate kurz ein verbuggte Version gab, in der $/ im Regex tatsaechlich zum input record separator expandiert wurde. Zwischen \z und $ besteht kein Unterschied, auch nicht mit einem Modifier wie /m. Bei \Z sieht die Sache dann wieder anders aus. Mehr dazu findest du unter man perlre. mfg Unix Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.