MatzeA: Oweh Stringvergleich udn ich kapiers grad nicht.

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

  1. 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.

    1. 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

      --
      Der Mund ist das Portal zum Unglück.
      1. 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.

        1. 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

        2. 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

          --
          Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
          1. 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

        3. 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

      2. 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

    2. 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

      1. 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

        --
        Der Verstand steht ueber allem. Was durch die Vorstellungskraft nicht geschaffen werden kann, existiert nicht.
        1. 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

          1. 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

            --
            Microsoft: Where do you want to go today?
            Linux: Where do you want to go tomorrow?
            FreeBSD: Are you guys coming, or what?
            1. 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

              --
              Gnade - was bedeutet dieses Wort?
      2. 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

        --
        exp(i * PI) + 1 = 0
        1. Servus,

          naja weil es für eines unserer Systeme gerantiert kein Modul zur Logfile Auswertung gibt.

          Gruss Matze

  2. 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

    1. 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

      1. 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

        1. 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

  3. 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 :-)´

    1. 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