Zum Inhalt springen

PERL: einzelne Buchstaben im Array ablegen


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von bigvic
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...