Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

jop, ich denke ist verständlich.

Aber wo ist dein Problem ?, was hast du bisher ?

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

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

THX. wrd ich dann mal Posten :-)

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

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 ;)

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

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

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.