Linda: Problem bei regulärem Ausdruck

Hallo,

ich habe das Problem, daß in meinem Perlscript folgender Ausdruck:
if (($from2 =~ /$fromwhom/i) && ...
prima funktioniert, wenn das eine im anderen enthalten ist, aber nicht mehr, wenn die beiden identisch sind.
Ist das normal?
Und wie kann ich die Bedingung als erfüllt gelten lassen, für den Fall, daß beide indetisch sind?
Danke und schönes WE

Linda

  1. Hi,

    if (($from2 =~ /$fromwhom/i) && ...
    prima funktioniert, wenn das eine im anderen enthalten ist, aber nicht mehr, wenn die beiden identisch sind.

    dann ist Dein "..." fehlerhaft - oder Deine Definition von "identisch". $foo =~ /$foo/ gilt für alle skalaren $foo.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      if (($from2 =~ /$fromwhom/i) && ...
      prima funktioniert, wenn das eine im anderen enthalten ist, aber nicht mehr, wenn die beiden identisch sind.

      dann ist Dein "..." fehlerhaft - oder Deine Definition von "identisch". $foo =~ /$foo/ gilt für alle skalaren $foo.

      Cheatah

      Hi Cheatah, hi Danny,

      @Danny: Habe Deinen Ausdruck verwendet, der ändert nichts :-(

      @Cheatah: Der reguläre Ausdruck ist Teil eines eigenen Emailspamfilters. Ich habe mal einen Auszug gemacht, damit Du sehen kannst, was genau nicht funktioniert, vielleicht wird es dann deutlicher:

      #! /usr/bin/perl
      $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
      $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";

      Inhalt öffnen, Inhalt einlesen, wieder schliessen

      if($test2 =~ /$test1/i) {
      print"ja, enthalten"
      } else {
      print"nein, nicht enthalten"

      Ergebnis: Nein, nicht enthalten

      Und das, obwohl die beiden doch identisch sind, verstehst Du?

      Grüße, Linda

      1. Hi,

        natürlich wird auch ein Posting hier unten gelesen.

        $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
        $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";

        if($test2 =~ /$test1/i) {

        Hm. $test1 enthält einige Zeichen, die im Kontext des regulären Ausdrucks Sonderbedeutung haben, z.B. die Fragezeichen.

        Probier mal die Zeichen mit Sonderbedeutung zu escapen, also
        $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. 你好 MudGuard,

          Probier mal die Zeichen mit Sonderbedeutung zu escapen, also
          $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";

          Dafuer gibt es btw. quotemeta() (perldoc -f quotemeta).

          再见,
           CK

          --
          Das Sein entsteht aus dem Nicht-Sein.
          http://wwwtech.de/
          1. Hi,

            Probier mal die Zeichen mit Sonderbedeutung zu escapen, also
            $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
            Dafuer gibt es btw. quotemeta() (perldoc -f quotemeta).

            Ich hab zu lange nichts mehr mit Perl angestellt ...

            cu,
            Andreas

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

              erstmal danke an alle. Klar, genau die Sonderzeichen in den "". Ich bin  wohl auch schon zu lange aus Perl raus, das hätte ich früher auch gewußt :-)
              Das mit der speziellen Funktion allerdings ist mir neu.
              Danke an alle, ich glaube, jetzt hab' ich wieder genug Input zum selber weiterbasteln.
              Grüße, danke und schönen Abend an alle

              Linda

              1. #! /usr/bin/perl
                $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";

                $test1=quotemeta($test1);
                $test2=quotemeta($test2);

                Inhalt öffnen, Inhalt einlesen, wieder schliessen

                if($test1 =~ /$test2/i) {

                print"ja, enthalten";
                } else {
                print"nein, nicht enthalten";
                }

                Ausgabe: nein, nicht enthalten

                Erstmal gute Nacht :-)

                Linda

                1. #! /usr/bin/perl
                  $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                  $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";

                  $test1=quotemeta($test1);
                  $test2=quotemeta($test2);

                  Inhalt öffnen, Inhalt einlesen, wieder schliessen

                  if($test1 =~ /$test2/i) {

                  print"ja, enthalten";
                  } else {
                  print"nein, nicht enthalten";
                  }

                  Ausgabe: nein, nicht enthalten

                  Erstmal gute Nacht :-)

                  Linda

                  print "\n$test1\n$test2"

                  Ausgabe:

                  =?utf-8?q?Ida\ Gtu?=\ compulsivehnaauf.com
                  =?utf-8?q?Ida\ Gtu?=\ compulsivehnaauf.com

                  Nun, was läuft denn  da falsch?

                  Linda

                2. Hi,

                  $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                  $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                  $test1=quotemeta($test1);
                  $test2=quotemeta($test2);

                  Der String, den Du mit dem regulären Ausdruck vergleichen/matchen willst, darf natürlich nicht mit quotemeta behandelt werden.

                  cu,
                  Andreas

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

                    $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                    $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                    $test1=quotemeta($test1);
                    $test2=quotemeta($test2);

                    Der String, den Du mit dem regulären Ausdruck vergleichen/matchen willst, darf natürlich nicht mit quotemeta behandelt werden.

                    Hallo Andreas,

                    warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne sind?

                    Linda

                    cu,
                    Andreas

                    1. 你好 Linda,

                      $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                      $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                      $test1=quotemeta($test1);
                      $test2=quotemeta($test2);

                      Der String, den Du mit dem regulären Ausdruck vergleichen/matchen
                      willst, darf natürlich nicht mit quotemeta behandelt werden.

                      warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne
                      sind?

                      Weil das Pattern, dass du dann benutzen muesstest auch die Backslashes in
                      dem ersten String matchen muesste. In dem String steht dann ja nicht mehr
                      "=?", sondern "=\?". Du willst ja mit dem quotemeta() nur die
                      Sonderbedeutung bestimmter Zeichen deaktivieren.

                      再见,
                       CK

                      --
                      Auf der ganzen Welt gibt es nichts Weicheres und Schwaecheres als Wasser. Doch in der Art, wie es dem Harten zusetzt, kommt nichts ihm gleich.
                      http://wwwtech.de/
                      1. 你好 Linda,

                        $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                        $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
                        $test1=quotemeta($test1);
                        $test2=quotemeta($test2);

                        Der String, den Du mit dem regulären Ausdruck vergleichen/matchen
                        willst, darf natürlich nicht mit quotemeta behandelt werden.

                        warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne
                        sind?

                        Weil das Pattern, dass du dann benutzen muesstest auch die Backslashes in
                        dem ersten String matchen muesste. In dem String steht dann ja nicht mehr
                        "=?", sondern "=\?". Du willst ja mit dem quotemeta() nur die
                        Sonderbedeutung bestimmter Zeichen deaktivieren.

                        再见,
                        CK

                        Hi Christian,

                        wenn ich doch 2 Variablen habe, die gleich sind, nämlich $test1 und $test2, so sollten sie doch auch nach jeweiliger Behandlung mit quotemeta immer noch identisch sein, oder?
                        quotemeta ist doch nur dazu da, die Sonderzeichen zu "eliminieren".
                        Oder?
                        Linda

                        1. 你好 Linda,

                          wenn ich doch 2 Variablen habe, die gleich sind, nämlich $test1 und
                          $test2, so sollten sie doch auch nach jeweiliger Behandlung mit
                          quotemeta immer noch identisch sein, oder?

                          Da liegt ja das Problem. Du moechtest mit quotemeta() erreichen, dass die
                          Sonderzeichen im ersten String deaktiviert werden, so dass du problemlos den
                          zweiten String damit matchen kannst. Behandelst du jetzt den zweiten String
                          auch mit quotemeta(), so machst du aus dem String "a?b?c?" eben
                          "a\?b\?c\?". Dadurch matcht natuerlich der erste String (wir erinnern
                          uns: der ist jetzt ebenfalls "a\?b\?c\?") nicht mehr auf den zweiten
                          String. Stell dir einfach vor, was jetzt im Klartext da stehen wuerde:

                          'a?b?c?' =~ /a?b?c?/;

                          Du siehst, das kann gar nicht matchen, weil der Match auf die \ in dem
                          ersten String jetzt fehlen.

                          再见,
                           CK

                          --
                          No Shoes On Mat!
                          http://wwwtech.de/
                          1. Du siehst, das kann gar nicht matchen, weil der Match auf die \ in dem
                            ersten String jetzt fehlen.

                            再见,
                            CK

                            Hi Christoph,

                            ok, so langsam kommt mein spärliches Wissen zurück :-)
                            Leider bekomme ich jetzt trotzdem eine Fehlermeldung, mit der ich nichtsgenaues anfangen kann.

                            Trailing \ in regex m/=?utf-8?q?Ida\ Gtu?=\ compulsivehnaauf@zerosexlife.com>/ at /.../homepages/... usw.

                            Der reg. Ausdruck hieß ja if (($from2 =~ /$fromwhom/i)...

                            Linda

                    2. Hi,

                      Der String, den Du mit dem regulären Ausdruck vergleichen/matchen willst, darf natürlich nicht mit quotemeta behandelt werden.
                      warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne sind?

                      Weil Du nur einen davon als regulären Ausdruck benutzen willst.

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      2. Привет Linda.

        #! /usr/bin/perl
        $test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
        $test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";

        Inhalt öffnen, Inhalt einlesen, wieder schliessen

        if($test2 =~ /$test1/i) {
        print"ja, enthalten"
        } else {
        print"nein, nicht enthalten"
        Ergebnis: Nein, nicht enthalten

        Du solltest dich mit der Bedeutung der Hochkommata nochmal belesen. Doppelte bedeuten, dass Perl den String interpolativ auswertet, sprich: es werden alle Perl bekannten reservierten Zeichen umgesetzt. In deinem Musterstring $test2 wird ein "@" verwendet, Perl erwartet also einen Array, den es in das Muster einsetzen kann. Du willst aber den literalen Kontext, also das, was da steht. Dazu müsstest du dann aber entweder das @ durch einen vorangestellten Backslash maskieren oder aber einfache Hochkommata verwenden.

        Ansonsten stellt sich im speziellen Fall die Frage, ob die Perl-eigenen Stringfunktionen oder sogar der simple Stringvergleich nicht völlig ausreichend wären.

        Дружба!
        Siechfred

        --
        Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
  2. Hi,

    versuche es mal so:
      if (($from2 =~ / ^ $fromwhom $ /ix) && ...

    Ich vermute den Fehler aber irgendwo anders (in den folgenden Bedingungen nach &&).

    MfG
    Danny