ubuntuusers.de

Perl: String ausschlachten

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

Superdreadnought

Anmeldungsdatum:
31. Mai 2006

Beiträge: 563

Hatt jemand Verbesserungsvorschläge für meine Methode die Informationen aus derartigen

Userinfo: \cg_etVersion\FalckonET 0.4.5, ET 2.60\cg_uinfo\13 0 30\g_password\none\cl_guid\E45CFF871AE3D580ACEB498C5F39577F\cl_wwwDownload\1\name\Polska\rate\25000\snaps\20\cl_anonymous\0\cl_punkbuster\1\ip\80.141.149.194:62405


Strings auszulesen?

$_ is so'n string.

		my $cinfo0 = $_;
		my @cinfo0 = split /\\cl_guid\\/, $cinfo0;
		my @cinfo1 = split /\\/, @cinfo0[1];
		my $guid = @cinfo1[0];

		my @cinfo1 = split /\\name\\/, @cinfo0[1];
		my @cinfo0 = split /\\/, @cinfo1[1];
		my $name = @cinfo0[0];

		my @cinfo0 = split /\\ip\\/, @cinfo1[1];
		my @cinfo1 = split /:/, @cinfo0[1];
		my $ip = @cinfo1[0];

THX4YA'HELP!

FLoH.tar

Anmeldungsdatum:
6. Januar 2006

Beiträge: 470

Probiere mal folgendes:

for ("cl_guid","name","ip") {
   $string =~ /\G$_\\(w+)[\\:]/;
   print $_, ": ", $1, "\n";
} 

Zu \G: perldoc perlre hat geschrieben:

The "\G" assertion can be used to chain global matches (using "m//g"), as described in "Regexp Quote-Like Operators" in perlop. It is also useful when writing "lex"-like scanners, when you have several patterns that you want to match against consequent substrings of your string, see the previous reference.

FLoH.tar

Superdreadnought

(Themenstarter)

Anmeldungsdatum:
31. Mai 2006

Beiträge: 563

Unrecognized escape \F passed through at ./string-ausschlachten.pl line 3.
Unrecognized escape \g passed through at ./string-ausschlachten.pl line 3.
Unrecognized escape \P passed through at ./string-ausschlachten.pl line 3.
Unrecognized escape \s passed through at ./string-ausschlachten.pl line 3.
Unrecognized escape \i passed through at ./string-ausschlachten.pl line 3.
Unrecognized escape \8 passed through at ./string-ausschlachten.pl line 3.
Use of uninitialized value in print at ./string-ausschlachten.pl line 7.
cl_guid:
Use of uninitialized value in print at ./string-ausschlachten.pl line 7.
name:
Use of uninitialized value in print at ./string-ausschlachten.pl line 7.
ip:

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Wenn ich mir deinen String etwas genauer anschauen sind alle Werte immer durch Backslashes getrennt. Weiterhin ist es anscheind so das immer ein Key kommt, danach ein Value. Sowas könntest du gleich in einem Hash packen.

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

my $string = 'Userinfo: \\cg_etVersion\\FalckonET 0.4.5, ET 2.60\\cg_uinfo\\13 0 30\\g_password\\none\\cl_guid\\E45CFF871AE3D580ACEB498C5F39577F\\cl_wwwDownload\\1\\name\\Polska\\rate\\25000\\snaps\\20\\cl_anonymous\\0\\cl_punkbuster\\1\\ip\\80.141.149.194:62405';

my %info;
if ( $string =~ m/\\(.*)/ ) {
    %info = split /\\/, $1;
}

print Dumper \%info;

Nur zur Info. Wenn ich den oben angegebenen String Manuel eingebe, dann müssen die backslahes natürlich escaped werden, also stehen bei mir oeben immer zwei Backslashes. Wenn du deine Daten aus einer Datenbank, aus einer Datei etc. ausliest dann musst du das natürlich nicht machen. $string enthält im Programmcode aber kein Newline Zeichen. Dies stellt nur das Forum "falsch" dar.

Der obrige Code gibt mir dann z.B. folgendes aus:

$VAR1 = {
          'cl_anonymous' => '0',
          'cg_etVersion' => 'FalckonET 0.4.5, ET 2.60',
          'ip' => '80.141.149.194:62405',
          'cl_punkbuster' => '1',
          'name' => 'Polska',
          'cl_guid' => 'E45CFF871AE3D580ACEB498C5F39577F',
          'cl_wwwDownload' => '1',
          'snaps' => '20',
          'rate' => '25000',
          'g_password' => 'none',
          'cg_uinfo' => '13 0 30'
        };

Wenn du also den Wert von "cl_guid", "name" und "ip" haben möchtest kannst du folgendes Schreiben.

printf "cl_guid ⇒ %s\nname ⇒ %s\nip ⇒ %s\n", @info{ qw(cl_guid name ip) };

Was dann folgendes ausgibt:

cl_guid => E45CFF871AE3D580ACEB498C5F39577F
name => Polska
ip => 80.141.149.194:62405

Oder du greift halt eben auf die einzelnen Werte zu:

$info{cl_guid}
$info{name}
$info{ip}
...

Superdreadnought

(Themenstarter)

Anmeldungsdatum:
31. Mai 2006

Beiträge: 563

ich muss mich nun echt mal wider bei dir bedanken sid! danke!

gleichzeitig muss ich mich aber auch fragen, wie man über perl so viel wissen kann. ich mach ja auch einiges in perl, aber wie man auf die ganzen kryptischen, kaum zu verstehenden (soll dir jetzt nicht sagen, dass du mir erklären sollst, was der befehl macht - peil ich schon nach näherem hinsehen) befehle kommt. neee.
ihr beschämt mich. ☹

😉

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

gleichzeitig muss ich mich aber auch fragen, wie man über perl so viel wissen kann.

So viel weiß ich gar nicht. Ich mache das ja auch nur Hobby mäßig. Leute die Beruflich in Perl Programmieren (oder generell Beruflich Programmieren) können sicherlich sehr viel mehr. Mein bisheriges Perl Wissen beruht eigentlich auch nur auf 4 Büchern.
1) Einführung in Perl
2) Einführung in Objekte Referenzen und Module
3) Reguläre Ausdrücke
4) Fortgeschrittene Perl Programmierung (1. Aufl)

Hab zwar sicherlich noch mehr Perl Bücher aber die Lese ich noch. Die oberen Bücher habe ich alle auf dem nach Hause weg in der Bahn gelesen. Also auch nichts wildes. Pro Tag vielleicht 1 Stunde gelesen.

Ansonsten habe ich immer hier & da mal diese Sprache angefangen, aber mich nie auf eine Sprache beschränkt. Naja und irgendwann habe mich entschlossen nun endlich eine "Sprache" komplett zu Lernen, meine Wahl war eben Perl. Es bringt mir letztendlich gar nicht wenn ich weiß wie ich in 10 Sprachen ein "Hello, World!" Programm schreibe.

Und letztendlich ist das meiste Wissen Generelles Programmierwissen, und nicht auf eine Sprache beschränkt, sei es nun CGI (HTML, CSS), Datenbankprogrammierung( SQL ), Netzwerkprogrammierung( Sockets, IO ), GUI-Programmierung, Objektorientierung, Regex etc. Das Wissen lernst du einmal und irgendwann Weist du es. Ob du nun Netzwerkprogrammierung in Perl, Python oder C++ machst ist dann auch kein großer Unterschied mehr. Die Befehle lauten etwas anders, die Syntax schaut etwas anders aus, aber im großen und ganzen ist es doch alles das selbe. Ob ich nun eine Methodenaufruf mit einem Punkt mache "object.method()" oder wie bei Perl mit einem Pfeil "object->method()" macht doch alles keinen Unterschied. Ob ich nun Blöcke durch Klammern, oder durch Ihre Einrückung bestimme, ob ich nun vor Variablen Sigils schreibe "$ @ %" oder eben weg lasse ist doch letztendlich nur "Kinderkram". Zwar gibt es sicherlich immer für den einen oder anderen Kinderkram Vor/Nachteile, und es gibt auch Unterschiede. Gerade diese Unterschiede machen ja auch die Unterschiedlichen Sprachen aus, und das hat ja auch zu meiner Wahl nach Perl geführt. (Ändert aber nichts daran das Autofahren Autofahren bleibt, egal welches Auto man nun benutzt. Auch wenn ein Jeep Sicherlich im Gelände besser geeignet ist als ein Ferrari.) Der Sinn hinter einem Array wird in C, Ruby, Python der selbe Sein, auch wenn die Syntax zur Defintion etwas anders ausschaut, und sicherlich das drumherum immer etwas anders ist. Mal ist ein Array halt ein Objekt, mal nicht, mal kann es alles aufnehmen (Typenlos) mal eben nicht etc. Solche spezielle Spracheigenheiten lernt man aber recht schnell.

Das andere Wissen "Programmierwissen" dauert aber länger zum Erlernen. Und dieses wird dir letztendlich in jeder Sprache helfen. Wenn man immer nur den Anfang lernt, dann hat man sehr viel Spezielles Wissen gelernt, aber wenig "Programmierwissen".

Wenn ich halt den Tip geben kann, dann sollte man sich einfach eine Sprache aussuchen die einem gefällt und dann in die tiefsten tiefen des Kanienchenbaus einsteigen. 😉 Mein führer ist halt Perl, andere haben sich für Python, Ruby, C++ oder Java entschieden. Letztendlich bleibt der Kaninchenbau aber gleich. Allerdings muss nicht das gleich sein was die einzelnen Personen sehen. Jeder sieht mit seinem Augen alles etwas anders.

Für die Einen ist der Stuhl grün, für die anderen Rot, letztendlich bleibt es aber ein Stuhl.

... Hmm naja, schon irgendwie wieder zu stark vom Thema abgewichen. 😉

ich mach ja auch einiges in perl, aber wie man auf die ganzen kryptischen, kaum zu verstehenden (soll dir jetzt nicht sagen, dass du mir erklären sollst, was der befehl macht - peil ich schon nach näherem hinsehen) befehle kommt. neee.

Welche Kryptischen Befehle?

Superdreadnought

(Themenstarter)

Anmeldungsdatum:
31. Mai 2006

Beiträge: 563

Welche kryptischen Befehle?

zb:

$info{'ip'} =~ s/:(.*)//;                #Port von der IP abschneiden


\^^ das hab ich zwar selber geschrieben, aber trotzdem, wenn man sich dsa mal ne woche nicht angeschaut hat versteht man da kein bit mehr.

oder deine signatur (kp was des heißt)

nebenbei hab ich erst mit delphi angefangen (inwzischen aber fast alles widder verlernt ← linux), dann kam java (aber java is sch**** → verlernt) und jetzt mach ich eben ein bisschen mit perl rum (mit mehr oder weniger erfolg). dazu kommt noch ein bisschen c++ (ich code ne mod für et - FalckonET, falls ihr schomma davon gehört habt). also ich hab programmiersprachn bis jetzt noch nie von anfang bis "ende" durchgezogen, sondern immer nur basics gemacht und etwas weiter hinten rumgestochert ...

mit perl hab ichs mir aber vorgenommen es ordentlich zu machen, aber ich hab mit dem buch irgendwo in der mitte aufgehört, nachdem, wenn ich was mach, es bei mir immer einen echten sinn haben muss (zb dieses etadmin_mod projekt jetzt - da kommt da zum schluss was anderes als ein stückchen code, das man auf der platte verrotten lässt, raus); aber da werd ich mir wohl echt mal einen ruck geben und mit dem buch (Einführung in Perl) neu anfangen müssen.

ps: könntest du mir mal die isbn's von deinen büchern geben? vorallem reguläre ausdrücke (zufällig das: http://www.amazon.de/Regul%e4re-Ausdr%fccke-Jeffrey-F-Friedl/dp/3897213494/sr=8-1/ ?) interessiert mich nämlich.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

$info{'ip'} =~ s/:(.*)//;                #Port von der IP abschneiden

\^^ das hab ich zwar selber geschrieben, aber trotzdem, wenn man sich dsa mal ne woche nicht angeschaut hat versteht man da kein bit mehr.

Ich kann die nur das Buch "Reguläre Ausdrücke" empfehlen. Dann wirst du mit solchen Sachen gar keine Probleme mehr haben, und sowas im Schlaf lesen. Zum anderen sind die Klammern () in deiner Regex überflüssig, und kosten sogar Performance. 😉

oder deine signatur (kp was des heißt)

Führe den Code doch einfach aus. 😉

Insgesamt nennt sich soetwas aber auch Obfuscation. Soetwas gibt es in fast jeder Programmiersprache. Der erste Kontest war damals in C gewesen. In Perl ist es aber auch sehr weit verbreitet, vielleicht mitlerweile sogar am weitesten durch den Reichtum der Sprache. Sinn von Obfuscation ist es ja gerade eben das andere Leute eben nicht verstehen was der Code macht.

Ich selber bin auch ncht in der Lage soetwas einfach so zu verstehen, oder direkt so zu schreiben. Letztendlich habe ich das Skript auch nur über einen Umweg über ein anderes Skript geschrieben, dann alles Rückwärts gemacht, und dann unleserlich gestaltet. Mehr als Fun ist das nicht.

Obfuscation ist letztendlich nur eine Sportart unter programmieren. Genauso wie z.B. Golf, wo man versucht wie beim echten Golf eine Programmierlösung mit Möglichst wenig Befehlen hinzubekommen. Oder bei Perl z.B. Haiku. Wo du gültigen Perl Code für den Compiler erzeugen musst, also das er nicht meckert, du den Code aber wie ein Japanisches gedicht lesen musst. Es gibt da noch mehr. Hier steht aber auch etwas über solche Sachen:
Perl
Schau einfach unter "Perl Kultur und Spaß".

Obwohl meine Signatur wohl eher ein JAPH ist, und kein Obfuscation. 😉

nebenbei hab ich erst mit delphi angefangen (inwzischen aber fast alles widder verlernt ← linux), dann kam java (aber java is sch**** → verlernt) und jetzt mach ich eben ein bisschen mit perl rum (mit mehr oder weniger erfolg). dazu kommt noch ein bisschen c++ (ich code ne mod für et - FalckonET, falls ihr schomma davon gehört habt). also ich hab programmiersprachn bis jetzt noch nie von anfang bis "ende" durchgezogen, sondern immer nur basics gemacht und etwas weiter hinten rumgestochert ...

Enemy Territory?
Habe ich früher genauso gemacht mit dem herumstochern.

ps: könntest du mir mal die isbn's von deinen büchern geben? vorallem reguläre ausdrücke (zufällig das: http://www.amazon.de/Regul%e4re-Ausdr%fccke-Jeffrey-F-Friedl/dp/3897213494/sr=8-1/ ?) interessiert mich nämlich.

Genau das ist das Buch was ich mit "Regulären Ausdrücken" meinte. Ist Praktisch das Standard Buch zu Regulären Ausdrücken. Ist auch sicherlich eines der bestne Büchern die ich gelesen habe.

Ansonsten denke ich du meintest jetzt nur die Bücher die ich oben genannt habe?
Dies sind alles Bücher aus dem O'Reilly Verlag.

http://www.oreilly.de/catalog/learnperl4ger/
http://www.oreilly.de/catalog/lrnperlormger/
http://www.oreilly.de/catalog/regex2ger/

Fortgeschritte Perl Programmierung 1.Auflage gibt es nicht mehr. Ich hatte es mir mal über Amazon Gebraucht Bestellt:
http://www.oreilly.de/catalog/fortperlger/

Finde ich aber ein gutes Buch, es sind sehr viele Tiefe Grundlegede Sachen enthalten.

Ich habe dann noch "Advanced Perl Programming Second Editon". Ist halt die Fortsetzung und deutlich neurer, (erste Auflage von 1998) davon gibt es aber noch keine Deutsche Auflage nur die englische: Du kannst das Buch aber nicht mit der ersten Auflage vergleichen. Das ist komplett anders. Das zweite Buch ist auch von einem ganz anderen Author geschrieben als das erste Buch.

Das zweite Buch ist aber deutlich praktischer, als die erste Auflage. Und es geht hier um aktuellen Techniken wie CGI, XML, Parsing, Templating Technolgien etc.
http://www.oreilly.de/catalog/advperl2/

Ansonsten natürlich immer noch das Standardwerk: Aber bisher immer noch nicht durchgelesen, immer hier und da Abschnitte.
http://www.oreilly.de/catalog/pperl3ger/

habe aber sicherlich noch mehr Bücher: Das Standardwerk zur Objektorientierung ist "Object oriented Perl", ausnahmsweise mal nicht von O'Reilly:
http://www.amazon.de/Object-Oriented-Perl-Damian-Conway/dp/1884777791/

Die Deutsche Auflage gibt es dazu aber auch nicht mehr. Ab und zu kannst du es bei amazon aber gebraucht bestellen:
http://www.amazon.de/Objektorientiert-Programmieren-Perl-Konzepte-Techniken/dp/3827318122/

Ansonsten sehr Praxis Orientiert ist das Perl Kochbuch:
http://www.oreilly.de/catalog/perlckbk2ger/

Und zum Lernen für sauberen Code zu Schreiben gibt es noch "Perl Best Practices"
http://www.oreilly.de/catalog/perlbpger/

Von den gennanten Büchern habe ich letztendlich nur das Perl Kochbuch nicht. Habe aber noch ein paar Bücher mehr. Das Perl Kochbuch ist halt hilfreich wenn du schnell mal eine Lösung benötigst zu kleinen Aufgaben. Es kommt immer eine Frage was du machen möchtest, und dann meistens ein oder zwei Lösungen dazu. Kannst dir ja das Inhaltsverzeichnis dazu anschauen welche Probleme da so behandelt werden.

Die ISBN NUmmern findest du auch auf den O'Reilly Seiten. 😉

Superdreadnought

(Themenstarter)

Anmeldungsdatum:
31. Mai 2006

Beiträge: 563

war heut inner buchhandlung und hab reguläre ausdrücke und reguläre ausdrücke kurz&gut geordert ...

nebenbei: was ist eigentlich der unterschied zwischen dem lama-buch /einführung in perl) und dem kamel buch (soweit ich weiß: programmieren mit perl), nachdem ich da nicht mehr so ganz durchblick, da ja der nachfolger das alpaka-buch (einführung in perl-objekte, referenzen und module)?

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

war heut inner buchhandlung und hab reguläre ausdrücke und reguläre ausdrücke kurz&gut geordert ...

Das kurz&gut Buch brauchst du eigentlich nicht wirklich. Die kurz&gut Bücher sind eigentlich immer nur dafür da wenn du ein Thema Bereits kennst, das du dich schneller zurecht findest. Gerade bei Regexen muss ich aber sagen, dass Sie eigentlich sehr simpel sind. (Naja mehr oder weniger) Jedenfalls sind sie in dem Sinne simpel, als das sie nicht einen so rieseigen Reichtum verfügen.

Und wenn du das Reguläre Ausdrücke Buch durcharbeitest, dann solltest du eigentlich auch keine Probleme mehr haben Regexe zu Verstehen. Der Umfang von Regexen wurde glaube ich schon im 1 & 2 Kapitel erklärt. Die restlichen Kapitel erklären eigentlich nur noch die Funktionsweise, wie Sie zu verstehen sind. Wie die Regex Engine Arbeitet, was letztendlich genau passiert wenn du eine Regex Schreibst, und wie du die einzelnen Sachen von Regexen zusammenfügen kannst damit das dabei heraus kommt, was du haben willst. Es wird darauf eingegangen wie du richtige Regexe schreibst, und du wirst sehen das das Schreiben von "richtigen" Regexen schwerer ist, als sie zu Lesen. Beim Lesen musst du nicht mehr viel nachdenken. Und es wird vorallem auf die Performance von NFA Regex Maschienen eingeganen. Was eine NFA und eine DFA Regex Engine ist, erklärt dir auch das Buch. 😉

Wie gesagt, Regexe selber sind relativ kurz, eigentlich gibt es da wenig was du dir behalten musst. Musst du doch mal etwas nachschlagen kannst du auch einfach "perldoc perlre" eintippen, was dann eigentlich komplett ausreichen sollte.

Aber okay, die 8€ sollten jetzt auch nicht sooo schlimm sein. 😉

Und nur so nebenbei gesagt. Nimm das Unicode Kapitel nicht so Ernst. Ich habe ne Kriese bekommen, als ich das Kapitel gelesen habe. 😉 Wenn du danach Unicode verteufelst kann ich dir das nicht Übel nehmen. 😉

nebenbei: was ist eigentlich der unterschied zwischen dem lama-buch /einführung in perl) und dem kamel buch (soweit ich weiß: programmieren mit perl), nachdem ich da nicht mehr so ganz durchblick, da ja der nachfolger das alpaka-buch (einführung in perl-objekte, referenzen und module)?

Lama Buch: Einführung in Perl
Alpaka Buch: Einführung in Perl, Objekte, Referenzen & Module
Kamel Buch: Programmierien mit Perl

Programmieren mit Perl ist das Buch vom Perl erfinder Larry Wall selber. Insgesamt wird dort Perl von vorne bis hinten erklärt. Es erklärt wie die Sprache aufgebaut ist, und es gibt insgesamt eine gute Einführung zu allen Themen. Allerdings ist dies schon eher weniger geeignet um Perl zu Lernen.

Das Lama Buch zielt aber genau darauf ab. Mit diesem Buch soll man recht Praxisnah Perl erlernen. Allerdings deckt das Lama Buch eigentlich nur einen kleinen Teil von Perl ab. Nach dem Lama Buch ist man zwar in der Lage hier und da kleine Skripte zu schreiben, man kann es gut als Ersatz für die Bash benutzen, und einfach Logdateien auswerten, allerdings ist man nicht unbedingt in der Lage große Projekte zu machen. Module zu schreiben etc.

Daher gibt es das Alpaka Buch, das die Fortsetzung zum Lama Buch ist. Und genau dieses Buch soll einem Zeigen wie man auch große Projekte oder Module Schreiben kann.

Das Kamel Buch ist sicherlich ein gutes Buch, aber nicht unbedingt geeignet zum Erlernen von Perl, oder Generell geeignet um eine Programmiersprache zu Erlernen. Dafür ist dann eher das Lama und das Alpaka Buch geeignet. Im Kamel Buch geht man halt davon aus das der Leser weiß was ein String ist, was eine Variable ist. Es wird halt mehr erklärt warum die variable in Perl so ist wie sie ist. 😉

Allerdings decken auch das Lama & Alpaka Buch nicht alle Aspekte von Perl ab. Ein paar Themen fehlen dort halt. Zum anderen gibt es im Kamel Buch auch mehr Ausführlichere Erklärungen. Wenn du z.B. das Thema IPC (Interprozess Kommunikation) aufschlägst wird im Kamel Buch gleich alles Mögliche über Unix Signale erklärt, während im Lama Buch mehr kurz die Verwendung gezeigt wird.

Das Kamel Buch ist halt Detailierter, wenn du es dir in der Buchhandlung mal anschaust wirst du sehen das das Kamel Buch fast doppelt so dick ist, wie das Lama und das Alpaka Buch zusammen. 😉

Superdreadnought

(Themenstarter)

Anmeldungsdatum:
31. Mai 2006

Beiträge: 563

wenn du denkst, dass es in einer provinz wie coburg (keine 50k einwohner), bücher wie "programmieren in perl" auf lager gibt, täuschst du dich leider. alles was fachspezifisch ist muss man da leider bestellen (naja, man findet schon so ein zwei bücher über die shell und einiges über c oder java, aber perl scheitn denen zu unwichtig ...).

Antworten |