Oweh Stringvergleich udn ich kapiers grad nicht.
MatzeA
- perl
0 Christoph Schnauß0 Jan R.0 Karl0 MatzeA
Servus,
ich möchte ma wieder aus einem Strng bestimmte informationen herauslesen.
Diesmal geht es darum aus einem Text z.B. dem Referer eine IP Abschnit zu ermitteln.
In einer if Schleife möchte ich nun aus dem String "192.168.0.5"
Nur prüfen und eine true erhalten, wenn in diesem String folgender Teilstring erhalten ist.
"192.168"
$ip =~ m/"192.168/***/;
Falls das nun etwas in die Irre führt. Die If Abfrage drumherum muss True ergeben und nicht der Text ersetzt werden.
Irgendwie so habe ich mir gedacht sollte es gehen geht nicht.
Hat mir jmand schnell eine Idee dazu??
In meinem Schlauen Buch wurde ich noch nicht fündig.
Vielen Dank schon mal im Vorraus.
Gruss Matze
hallo Matze
ich möchte ma wieder aus einem Strng bestimmte informationen herauslesen.
Das ist etwas, was man durchaus häufiger tun möchte. Aber mit
$ip =~ m/"192.168/***/;
wird, wenn ich das richtig lese, nichts "ausgelesen", sondern gleich die Zeichenfolge "192.168 (einschließlich des doppelten Anführungszeichens!) durch *** ersetzt, und ob du das "m" vorne wirklich brauchst, wäre auch zu überdenken.
Die If Abfrage drumherum muss True ergeben und nicht der Text ersetzt werden.
Dann solltest du eventuell deine "if-Abfrage" noch herschreiben.
Ich würde genau andersherum an die Lösung herangehen, also _nicht_ nachschauen, ob eine Bedingung zutrifft, sondern gleich festlegen, was geschehen soll, wenn sie nicht zutrifft.
In meinem Schlauen Buch wurde ich noch nicht fündig.
Welches schlaue Buch liest du denn grade?
Grüße aus Berlin
Christoph S.
Hallo Christoph,
$ip =~ m/"192.168/***/;
wird, wenn ich das richtig lese, nichts "ausgelesen", sondern
gleich die Zeichenfolge "192.168 (einschließlich des doppelten
Anführungszeichens!) durch *** ersetzt, und ob du das "m" vorne
wirklich brauchst, wäre auch zu überdenken.
Nein. 'm' steht fuer 'Match', das einzige, was mit dem Code oben
passiert, ist ein Syntax-Fehler.
Gruesse,
CK
hallo CK,
ob du das "m" vorne wirklich brauchst, wäre auch zu überdenken.
Nein. 'm' steht fuer 'Match'
Ja, ich weiß, wofür das "m" steht - oder stehen soll. Wann ist es denn sinnvoll und wann braucht man es nicht? Nach der von Matze beschriebenen Aufgabenstellung halte ich es nicht für zwingend nötig. Schaden kanns aber nix und geradezu "falsch" ist es nun wirklich nicht.
Grüße aus Berlin
Christoph S.
Hallo Christoph,
[...] das "m" [...] Wann ist es denn sinnvoll und wann braucht man es nicht?
Soweit mir bekannt, brauchst du das m dann nicht, wenn du als Begrenzer in deinem RegEx den Slash "/" oder das Fragezeichen "?" verwendest. Nimmst du einen anderen, nicht traditionsbedingten Begrenzer (z.B. den Doppelpunkt ":"), musst du den Match-Operator nehmen.
Nach der von Matze beschriebenen Aufgabenstellung halte ich es nicht für zwingend nötig.
Nein, nach den von ihm verwendeten Begrenzern nicht.
Schaden kanns aber nix und geradezu "falsch" ist es nun wirklich nicht.
Nun ja, überflüssig halt ;-))
Grüße
Torsten
Hallo Christoph,
ob du das "m" vorne wirklich brauchst, wäre auch zu überdenken.
Nein. 'm' steht fuer 'Match'Ja, ich weiß, wofür das "m" steht - oder stehen soll.
Warum hast du dann was von 'ersetzen' geschrieben? Der m-Operator
ist der m-Operator, der s-Operator ist der s-Operator. Der s-Operator
ist der Ersetungs-Operator, der m-Operator ist der Match-Operator. 'm'
ist in vielen Faellen implizit, 's' nie. 's' hat nichts mit 'm' zu
tun, gar nichts.
Wann ist es denn sinnvoll und wann braucht man es nicht?
Man braucht es, wenn der Interpreter aus dem Kontext nicht
erschliessen kann, dass es sich um einen RegEx handelt. Das ist z.
B. bei Konstruktionen wie
while(<STDIN>) {
next if !blahr!;
}
der Fall. Hier muesste es
next if m!blahr!;
heissen.
Schaden kanns aber nix und geradezu "falsch" ist es nun wirklich
nicht.
Falsch war deine Annahme, dass da irgendwas ersetzt wird. Da wird nix
uebersetzt. Da wird ein Syntax-Fehler generiert.
Gruesse,
CK
Hallo CK,
Man braucht es, wenn der Interpreter aus dem Kontext nicht
erschliessen kann, dass es sich um einen RegEx handelt.
Ja, das ist m.W.n. allerdings nur bei den "traditionellen" Begrenzern "/" und "?" möglich. Ansonsten ist als Begrenzer jedes literale Zeichen (Zeichen, die sind, was sie sind) zulässig außer den Zeichen der Zeichenklassen "\s" und "\w". Wobei natürlich bedacht werden muss, dass der Begrenzer, wenn man ihn innerhalb des RegEx als literales Zeichen sucht, soweit ich weiß stets maskiert werden muss, also auch in Zeichenklassen. Und dass man in den letztgenannten Fällen stets den Match-Operator verwenden muss, dürfte klar sein.
Nur zur Archivergänzung
Torsten
Servus,
Ja, ich weiß, wofür das "m" steht - oder stehen soll. Wann ist es denn sinnvoll und wann braucht man es nicht? Nach der von Matze beschriebenen Aufgabenstellung halte ich es nicht für zwingend nötig. Schaden kanns aber nix und geradezu "falsch" ist es nun wirklich nicht.
Laut meinem Buch benätigt man die angabe von m bzw. s genau dann wenn / nicht das Trennzeichen ist.
Mit der angabe m kann jedes beliebige Zeichen, sofern es nicht alphanumerisch bzw. ein Whitespace ist, verwendet werden.
Besonders dann vorteilhaft, wenn man Inhalte wie z.B. "c:/temp/..."
untersuchen muss.
Gruss Matze
Servus,
Nein. 'm' steht fuer 'Match', das einzige, was mit dem Code oben
passiert, ist ein Syntax-Fehler.
genau das ist das Problem.
Folgendes müsste jedoch im Erfolgfalle true ergebe richtig?
$text =~ /192.168/;
Schätzungsweise muss ich noch den . mit einem \behandeln, damit Mir Perl keine Probleme bereiten.
Richtig oder falsch?
Gruss Matze
Servus,
wird, wenn ich das richtig lese, nichts "ausgelesen", sondern gleich die Zeichenfolge "192.168 (einschließlich des doppelten Anführungszeichens!) durch *** ersetzt, und ob du das "m" vorne wirklich brauchst, wäre auch zu überdenken.
Ich denke das hat soweit schon Christian beantwortet.
Dann solltest du eventuell deine "if-Abfrage" noch herschreiben.
Wozu???
Wie eine If abfrage geht sollte wohl jeder wissen.
lediglich ->
$testvar =~ /192.168/; Sollte true ergeben.
Schätzungsweise müsste es jedoch
$testvar =~ /192.168/; heissen.
Weiss es grad nicht aber werde es prüfen.
Ich würde genau andersherum an die Lösung herangehen, also _nicht_ nachschauen, ob eine Bedingung zutrifft, sondern gleich festlegen, was geschehen soll, wenn sie nicht zutrifft.
»»
Ja und nein ich muss hier ein Fallunterscheidung vornehmen.
Und ja ich weiss, dass man die IP Adressen des Referers fälschen kann.
Darum geht es aber überhaubt nicht sondern infach um eine Routing Analyse die ich gerade mache.
Dabei will ich die bisherigen Logfiles auswerten.
Inzwischen bin ich soweit, dass ich jeden einzelnen der Einträge bis auf die IP / Aktion usw auseinander gefieselt habe.
Mit dieser IP Weiche wollte ich nur noch nach Routing Herkunft sortieren, bzw eine weitere Untersuchung anstossen, da je nach herkunft die Informatione völlig unterschiedlich sind.
In meinem Schlauen Buch wurde ich noch nicht fündig.
Welches schlaue Buch liest du denn grade?
Mehrere O`Reilly Bücher zu Thema Perl.
Hätt ich gewusst, dass ich das unter m Modifikator finde.....
Gruss Matze
Hallo MatzeA,
Hätt ich gewusst, dass ich das unter m Modifikator finde.....
*Dieses* m ist kein Modifikator, sondern ein Operator. Das hinten
angestellte m waere ein Modifikator, haette aber einen komplett anderen
Sinn.
Gruesse,
CK
Servus,
soweit schon klar.
Aber in meinem Buch war es unter "m - Mofifikator" zu finden.
Frag mich nicht wieso im Kapitel der Regexp habe ich eben im Kreis
gelesen.
Gruss Matze
Hallo MatzeA,
Aber in meinem Buch war es unter "m - Mofifikator" zu finden.
Dann hast du ueber den Modifikator gelesen. Es gibt einen Operator und
einen Flag. Die beiden haben lediglich den Namen gemeinsam:
next if m!^blahr$!m;
Gruesse,
CK
Sup!
Aber in meinem Buch war es unter "m - Mofifikator" zu finden.
Dann hast du ueber den Modifikator gelesen. Es gibt einen Operator und
einen Flag. Die beiden haben lediglich den Namen gemeinsam:next if m!^blahr$!m;
Aber wenn es doch im O'Reilly-Perl-Buch (in dem, wo die RegExp so schwierig erklärt werden, daß man nicht rausfinden kann, wie man einen Zeichenkettenvergleich macht) von unserem Großverdiener MatzeA unter "m-Modifikator" stand?
*SCNR*
Gruesse,
Bio
Hallo MatzeA,
Inzwischen bin ich soweit, dass ich jeden einzelnen der Einträge bis auf die IP / Aktion usw auseinander gefieselt habe.
vielleicht solltest du einfach mal beim CPAN nach einem passenden Modul suchen. Dort finden sich dutzende Module die für die Analyse von allen möglichen Logfiles verwendet werden können. Warum das Rad neu erfinden?
Grüße,
Peter
Servus,
naja weil es für eines unserer Systeme gerantiert kein Modul zur Logfile Auswertung gibt.
Gruss Matze
Hallo MatzeA,
Irgendwie so habe ich mir gedacht sollte es gehen geht nicht.
Hat mir jmand schnell eine Idee dazu??
Genau fuenf Klicks von Deinem Posting entfernt:
1) http://aktuell.de.selfhtml.org/ ->
2) http://selfhtml.teamone.de/ ->
3) http://selfhtml.teamone.de/cgiperl/index.htm ->
4) http://selfhtml.teamone.de/cgiperl/sprache/index.htm ->
5) http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm
Beste Gruesse
Jan
Servus,
danke schon mal, aber kannst du mir das erklären?
foreach(@Orte) {
--> if( $_ =~ /-->^<--M/ ) {
print "$_ fängt mit M an<br>\n";
}
}
Was wird durch ^M erreicht?
Hätte da nicht einfach nur M ausgereicht?
Gruss Matze
Hallo MatzeA,
foreach(@Orte) {
if( $_ =~ /^M/ ) {
Was wird durch ^M erreicht?
Hütchensymbol:
vor literalen Zeichen: der String soll damit beginnen
innerhalb von Zeichenklassen: Verneinung der Zeichenklasse
ohne Hütchen: irgendein "M" im gesamten String
Grüße
Torsten
Servus,
vielen Dank das ist gut zu wissen und danach hatte ich schon gesucht gehabt. Glaubte jedoch, dass man das mit dem Modifikator angiebt.
Gruss Matze
Hallo MatzeA
In einer if Schleife möchte ich nun aus dem String "192.168.0.5"
Nur prüfen und eine true erhalten, wenn in diesem String folgender Teilstring erhalten ist."192.168"
Was für ein Thread !
Diese Aufgabe mit Regexp zu lösen hiesse mit Kanonen auf Spatzen zu schiessen.
Wie wärs mit:
$ip = "192.168.0.5";
if(index($ip,"192.168") >= 0) {
antwort = true;
}
else {
antwort = false;
}
mit einer geringfügigen änderung kannst du auch gleich feststellen ob die IP an der richtigen stelle steht.
z.b.:
if(index($ip,"192.168") == 0)
die IP muss nicht nur "192.168" irgendwo enthalten sondern damit beginnen.
anleitung unter: http://selfhtml.teamone.de/cgiperl/funktionen/zeichenketten.htm#index
karl :-)´
Servus,
$ip = "192.168.0.5";
if(index($ip,"192.168") >= 0) {
antwort = true;
}
else {
antwort = false;
}
Vielen herzlichen Dank.
-> instring müsste auch eine Mögliche methode sein.
Gibt es die bei Perl?!? Ich wess es grad nicht.
Aber Deine Idee ist vorläufig die beste.
Gruss Matze