dummabua Geschrieben 2. November 2004 Teilen Geschrieben 2. November 2004 Hi, hab hier ein Textfile in dem 3000 Nummern drinstehen. eine Nummer Pro Zeile, also ca. so: AT96986986 AT96234434 AT96749078 AT93242356 AT04790777 ... nun kann es sein, dass 2 mal die gleiche nummer untereinandersteht. die doppelten nummern sollen in eine weitere textdatei geschrieben werden. hier mal mein skript: #!/usr/bin/perl -w $i = "0"; $j = "1"; $file = "doppelte2.txt"; $file2 = "doppelte_perl.txt"; open (FILE, $file) || die("Kann $file nicht oeffnen!\n"); while(<FILE>) { push @elemente, $_; } open (FILE2, $file2) || die("Kann Datei nicht anlegen\n"); while (@elemente) { if ($elemente[$i] eq $elemente[$j]) { print FILE2 "$elemente[$i]\n"; $i++; $j++; } } close (FILE); close (FILE2); print "Done!\n"; das skript startet zwar, kommt aber zu keinem ende irgendwie Erros hab ich keine... Hab ich irgenwo nen Fehler drin? bin echt ratlos :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dummabua Geschrieben 2. November 2004 Autor Teilen Geschrieben 2. November 2004 Hi, habs selber gelöst das problem war folgende zeile: while (@elemente) damit is er mir in ne endlosschleife gefallen so funzts: while (defined $elemente[$j]) trotzdem danke fürs lesen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
taschentoast Geschrieben 2. November 2004 Teilen Geschrieben 2. November 2004 Hi, wenn du eine Shell hast: #> cat $datei | perl -ne 'print if ($seen{$_}++)' > $doppelte wenn du keine Shell hast: #!/usr/bin/perl -w %seen = (); $file = "nummern.txt"; $file2 = "doppelte.txt"; open (FILE, "<$file") || die("Kann $file nicht oeffnen!\n"); open (FILE2, ">$file2") || die("Kann $file2 nicht oeffnen!\n"); while(<FILE>){ print FILE2 if ($seen{$_}++); } In FILE2 sind jetzt alle doppelten Einträge. Allerdings ungeordnet. Aber das Skript sieht hübscher aus viel Spaß taschentoast Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dummabua Geschrieben 2. November 2004 Autor Teilen Geschrieben 2. November 2004 Hi taschentoast, bin nicht DER Perl Gott für mich sieht das schon ein bissal obfuscated aus kannst mir vielleicht die zeilen mal kommentieren, was die genau machen ? also zumindest das in der while schleife? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
taschentoast Geschrieben 2. November 2004 Teilen Geschrieben 2. November 2004 Hi taschentoast, bin nicht DER Perl Gott Ich auch nicht, aber mit Perl kann man so lustige Schweinereien machen für mich sieht das schon ein bissal obfuscated aus kannst mir vielleicht die zeilen mal kommentieren, was die genau machen ? also zumindest das in der while schleife? Logisch. Mach ich heut abend (so ab 1800), wenn ich zuhaus bin. Im Moment is zuwenig Zeit. bis dahin 2 Stichworte: Magical Autoincrement. Ich meld mich wieder taschentoast Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
taschentoast Geschrieben 2. November 2004 Teilen Geschrieben 2. November 2004 So dann wollen mir mal. Man möge mir evtl technisch ungenaue Formulierungen entschuldigen, nur das Prinzip ist wichtig #!/usr/bin/perl -w %seen = (); # initialisiere hash $file = "nummern.txt"; $file2 = "doppelte.txt"; open (FILE, "<$file") || die("Kann $file nicht oeffnen!\n"); # $file für "nur-lesen" öffnen open (FILE2, ">$file2") || die("Kann $file2 nicht oeffnen!\n"); #$file2 für "nur schreiben" öffnen while(<FILE>){ #solange Zeilen von FILE eingelesen werden können, tue: print FILE2 if ($seen{$_}++); #das hier. siehe unten. } was macht "print FILE2 if ($seen{$_}++);"? ++ ist hier ein sog. "magical autoincrement", d.h. erhöhe das was links vom ++ steht, oder lass es. Ausgeschrieben ist das nix anderes als "$seen{$_} = $seen{$_} + 1" (im String-Kontext wird binär erhöht). Näxter Punkt: Mit $seen{$_} wird in den hash %seen ein Schlüssel/Wert-Paar geschrieben, mit Schlüssel=$_ (sprich, der aktuell eingelesenen Zeile) und Wert=undef (hoffentlich! weiß einer mehr? ). Jetzt kommt das "magical". Das if prüft: "Konnte ich den Wert, der dem Schlüssel $_ zugeordnet ist erhöhen?". Das geht natürlich nur, wenn schon ein Schlüssel/Wert-Paar existiert. Also gibt die Bedingung true zurück, wenn erhöht werden konnte, und false, wenn nicht erhöht werden konnte (außerdem wird noch $_ als Schlüssel/Wert in den hash eingetragen für die nächste Überprüfung). Danach kommt nur noch standard Perl. In der Langform: if($seen{$_}++){ #wenn true print FILE2 "$_"; #gib in Filehandle FILE2 $_ (die aktuell eingelesene Zeile) aus } Fertig. Alles verständlich soweit? taschentoast Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dummabua Geschrieben 2. November 2004 Autor Teilen Geschrieben 2. November 2004 muss ich mir zwar nochmal durchlesen, aber danke schonmal Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 3. November 2004 Teilen Geschrieben 3. November 2004 So dann wollen mir mal. Man möge mir evtl technisch ungenaue Formulierungen entschuldigen, nur das Prinzip ist wichtig #!/usr/bin/perl -w %seen = (); # initialisiere hash $file = "nummern.txt"; $file2 = "doppelte.txt"; open (FILE, "<$file") || die("Kann $file nicht oeffnen!\n"); # $file für "nur-lesen" öffnen open (FILE2, ">$file2") || die("Kann $file2 nicht oeffnen!\n"); #$file2 für "nur schreiben" öffnen while(<FILE>){ #solange Zeilen von FILE eingelesen werden können, tue: print FILE2 if ($seen{$_}++); #das hier. siehe unten. } was macht "print FILE2 if ($seen{$_}++);"? ++ ist hier ein sog. "magical autoincrement", d.h. erhöhe das was links vom ++ steht, oder lass es. Ausgeschrieben ist das nix anderes als "$seen{$_} = $seen{$_} + 1" (im String-Kontext wird binär erhöht). Näxter Punkt: Mit $seen{$_} wird in den hash %seen ein Schlüssel/Wert-Paar geschrieben, mit Schlüssel=$_ (sprich, der aktuell eingelesenen Zeile) und Wert=undef (hoffentlich! weiß einer mehr? ). Jetzt kommt das "magical". Das if prüft: "Konnte ich den Wert, der dem Schlüssel $_ zugeordnet ist erhöhen?". Das geht natürlich nur, wenn schon ein Schlüssel/Wert-Paar existiert. Also gibt die Bedingung true zurück, wenn erhöht werden konnte, und false, wenn nicht erhöht werden konnte (außerdem wird noch $_ als Schlüssel/Wert in den hash eingetragen für die nächste Überprüfung). Danach kommt nur noch standard Perl. In der Langform: if($seen{$_}++){ #wenn true print FILE2 "$_"; #gib in Filehandle FILE2 $_ (die aktuell eingelesene Zeile) aus } Fertig. Alles verständlich soweit? taschentoast Jetzt weiss ich warum ich mich vor 2 Jahren hingesetzt hab und PHP gelernt hab anstatt Perl. Das sieht ja alles aus wie Kraut und Rüben,... :floet: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
taschentoast Geschrieben 3. November 2004 Teilen Geschrieben 3. November 2004 Jetzt weiss ich warum ich mich vor 2 Jahren hingesetzt hab und PHP gelernt hab anstatt Perl. Das sieht ja alles aus wie Kraut und Rüben,... :floet: Wieso anstatt? Perl ist keine Alternative zu PHP und umgekehrt. Die Grundfunktionen die beide Sprachen erfüllen sollen sind absolut verschieden und somit nicht vergleichbar. Dass PHP und Perl gelegentlich für Dinge "missbraucht" werden, für die sie nicht gedacht sind, sollte einen selber nicht abhalten, das richtige Werkzeug für das Problem zu wählen. Und in dem Fall war meines Erachtens Perl am besten geeignet. Und zu dem "Kraut und Rüben": Für mich sieht schlampige PHP-Programmierung auch aus wie Kraut und Rüben. Perl ist eben die Antwort, nur die Frage kennt man oft nicht auf eine friedliche Koexistenz von Perl und PHP taschentoast Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 3. November 2004 Teilen Geschrieben 3. November 2004 Wieso anstatt? Perl ist keine Alternative zu PHP und umgekehrt. Naja also in meinem Fall waren Perl und PHP die alternativen die ich zur Auswahl hatte, da es "nur" um Webserverprogramierung gegangen ist. Und zu dem "Kraut und Rüben": Für mich sieht schlampige PHP-Programmierung auch aus wie Kraut und Rüben. Das ist sicherlich richtig, schlampige programierung sieht immer aus wie Kraut und Rüben Aber ich bin davon ausgegangen, dass das o.g. Beispiel ordentlich programiert ist und es sieht für mich destotrotz aus wie Kraut und Rüben ;D. (Mag auch daran liegen, dass ich noch nie mit Perl gearbeitet habe...) Perl ist eben die Antwort, nur die Frage kennt man oft nicht PHP wäre ebenfalls eine Antwort auf diese komische Frage gewesen :-) auf eine friedliche Koexistenz von Perl und PHP dito taschentoast kills Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.