Dirk: regulärer Ausdruck

Hallo zusammen,

ich habe ein Problem mit einem reg. Ausdruck, dessen Suchmuster in einer Variablen steht.
Code:
$m04 = "suchstring";
if($Form{'c'} =~/$m04/im) {
  tu was;
  }

Die Bedingung wird seltsamerweise nie erfüllt, auch wenn "suchstring" definitiv in $Form{'c'} enthalten ist. Wo liegt mein Fehler?

Gruß, Dirk

  1. $m04 = "suchstring";

    Wie sieht dein Muster tatsächlich aus? Gibt es Warnungen? Wie ist der String aufgebaut, der getestet werden soll? Ansonsten: Benutze *stets* das strict-Pragma und frage Warnungen ab.

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
    1. $m04 = "suchstring";

      Wie sieht dein Muster tatsächlich aus? Gibt es Warnungen? Wie ist der String aufgebaut, der getestet werden soll? Ansonsten: Benutze *stets* das strict-Pragma und frage Warnungen ab.

      Siechfred

      Das Suchmuster ist dynamisch und wird aus übergebenen Formulardaten extrahiert. Das klappt auch, in $m04 steht tatsächlich das drin, wonach gesucht werden soll. Nein, es gibt keinerlei Warnungen.

      1. Hi,

        Das Suchmuster ist dynamisch und wird aus übergebenen Formulardaten extrahiert. Das klappt auch, in $m04 steht tatsächlich das drin, wonach gesucht werden soll. Nein, es gibt keinerlei Warnungen.

        Kann es sein, dass in dem Suchmuster Sonderzeichen stehen, die maskiert werden sollten?
        Eine Moeglichkeit zum maskieren waere quotemeta().

        mfG,
        steckl

        1. Eine Moeglichkeit zum maskieren waere quotemeta().

          Oder \Q..\E (siehe perlre).

          Siechfred

          --
          Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        2. Kann es sein, dass in dem Suchmuster Sonderzeichen stehen, die maskiert werden sollten?
          Eine Moeglichkeit zum maskieren waere quotemeta().

          mfG,
          steckl

          quotemeta() war die Lösung, danke :-)

          Gruß, Dirk

          1. quotemeta() war die Lösung, danke :-)

            D.h. du hast Siechfred angelogen, entweder hast du die Warnungen nicht eingeschaltet oder nicht nachgesehen ob wirklich welche angezeigt werden (du musst Perl darum bitten es zu tun) auch vermute ich, dass du kein use strict verwendest, das sind alles Hilfsmittel die dir die Arbeit erleichtern, da du damit solche Fehler schnell findest (und darüber hinaus auch Fehler die du ohne, so gut wie gar nicht findest)

            Ausserdem würde ich dir dringend zu der Verwendung des Modul CGI raten, dass Formular eingaben zuverlässig verabreitet und darüber hinaus noch viele Funktionen bietet um einfach HTML Seiten aufzubauen.

            Struppi.

      2. Das Suchmuster ist dynamisch und wird aus übergebenen Formulardaten extrahiert. Das klappt auch, in $m04 steht tatsächlich das drin, wonach gesucht werden soll.

        Wie wird es extrahiert und wie kann so ein Muster aussehen? Evtl. gibt's Probleme mit unmaskierten Sonderzeichen. Wenn das Muster ein normaler String ist, reicht übrigens index aus.

        Ach ja, wie wäre es mit ein bisschen mehr Code?

        Siechfred

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
  2. Hallo zusammen,

    ich habe ein Problem mit einem reg. Ausdruck, dessen Suchmuster in einer Variablen steht.
    Code:
    $m04 = "suchstring";
    if($Form{'c'} =~/$m04/im) {
      tu was;
      }

    Die Bedingung wird seltsamerweise nie erfüllt, auch wenn "suchstring" definitiv in $Form{'c'} enthalten ist. Wo liegt mein Fehler?

    Gruß, Dirk

    Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
    Du wolltest wohl, dass "$m04" durch "suchstring" ersetzt wird, aber im Kontext des Regexs bedeutet das "$" nur "Suche am Anfang des Strings".

    1. Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
      Du wolltest wohl, dass "$m04" durch "suchstring" ersetzt wird, aber im Kontext des Regexs bedeutet das "$" nur "Suche am Anfang des Strings".

      Ich denke mal nicht, siehe http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichenketten dort Nr.20

      Ich will auch nichts ersetzen, sondern nur prüfen, ob das Suchmuster enthalten ist, sonst nichts.

    2. Hi,

      Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
      Du wolltest wohl, dass "$m04" durch "suchstring" ersetzt wird, aber im Kontext des Regexs bedeutet das "$" nur "Suche am Anfang des Strings".

      Nein, ein "$" am Ende bedeutet Ende des Strings (bzw. der Zeile). Fuer den Anfang gibt es "^".

      mfG,
      steckl

    3. Hallo Ach,!

      Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.

      Nein: Variableninterpolation findet auch innerhalb der Begrenzugszeichen statt.

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Hi,

        Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.

        Nein: Variableninterpolation findet auch innerhalb der Begrenzugszeichen statt.

        Kleine Ergänzung: aber nicht, wenn als Begrenzungszeichen das ' gewählt wird.
        (und, wenn ich mich richtig erinnere, auch nicht, wenn () als Begrenzungszeichen gewählt werden)

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo MudGuard!

          Nein: Variableninterpolation findet auch innerhalb der Begrenzugszeichen statt.
          Kleine Ergänzung: aber nicht, wenn als Begrenzungszeichen das ' gewählt wird.

          Klar, da haben die Hochkommata die gleiche Wirkung wie bei Strings:
          my $auto = "dem blauen Ding da in der Signatur";
          my $str = 'Ich fahre mit $auto'; # keine Interpolation

          (und, wenn ich mich richtig erinnere, auch nicht, wenn () als Begrenzungszeichen gewählt werden)

          Doch, da auch (zwei erste Beispiele):

            
          my $muster = "Deinem";  
          my $str = "Ich fahre gerne mit meinem Auto";  
          $str =~ s(meinem)($muster);  
          print $str, "\n";             # Ich fahre gerne mit Deinem Auto  
          $str =~ s($muster)(unserem);  
          print "$str\n";               # Ich fahre gerne mit unserem Auto  
          $str =~ s'unserem'$muster';  
          print "$str"."\n";            # Ich fahre gerne mit $muster Auto  
          
          

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?