Daniela Koller: Regexp matcht nur einmal bei 2 scheinbar identischen Fällen

Hi Leute

Ich habe einen Regexp den ich aus einem Konfigurationsfile einlese. Er ist in  $regexp gespeichert. Weiter habe ich einen Wert der auf diesen Regexp matchen soll. Es ist der Wert des Attributs "name" von einem Metatag:

File 1:
<meta name="DC.Date"        content="2001-10-27T08:00+01:00">

File 2:
<meta name="DC.Date"        content="2001-10-27T08:00+01:00">

$attrvalue ist, wie an den Debugausgaben weiter unten zu sehen, korrekt abgefüllt, genauso $regexp. Trotzdem matcht beim zweiten File der Regexp nicht. Er scheitert an der 5. Bedingung.

print "Content: " . $attrvalue . " Regexp: " . $regexp .  "\n";
print "Vgl1: " . (defined $regexp)
      . " Vgl2: " . ($attribute_config->{type})
      . " Vgl3: " . ($attribute_config->{type} ne 'tag')
      . " Vgl4: " . ($attribute_config->{type} ne 'cont')
      . " Vgl5: " . ($attrvalue =~ /$regexp/) . "\n";

File 1:
Content: DC.Date Regexp: DC.Date$
Vgl1: 1 Vgl2: content Vgl3: 1 Vgl4: 1 Vgl5: 1

File 2:
Content: DC.Date Regexp: DC.Date$
Vgl1: 1 Vgl2: content Vgl3: 1 Vgl4: 1 Vgl5:

Sieht jemand etwas, das ich übersehen habe?

Gruss Daniela

  1. Hallo Daniela,

    File 1:
    <meta name="DC.Date"        content="2001-10-27T08:00+01:00">

    File 2:
    <meta name="DC.Date"        content="2001-10-27T08:00+01:00">

    Bist du sicher, dass da nicht irgendwelche kurriosen Whitespaces in den name-Attributen
    sind? Solche Fehler habe ich nur unter derartigen Umständen erlebt.

    Grüße,
     CK

    --
    Die Stärke des Geistes ist unendlich, die Muskelkraft dagegen ist begrenzt.
    http://wwwtech.de/
    1. Hi Christian

      Bist du sicher, dass da nicht irgendwelche kurriosen Whitespaces in den name-Attributen
      sind? Solche Fehler habe ich nur unter derartigen Umständen erlebt.

      Ich wüsste nicht wie. Ich hab den Meta-Tag sogar schon abgetippt und den alten rausgelöscht.

      Gruss Daniela

  2. Hallo Daniela,

    was mir noch eingefallen ist: du liest den RegEx aus einer Konfigurations-Datei? Und der
    RegEx ist 'DC.Date$'? Und du wendest ihn via /$regexp/ an? Dann versucht er wohl auf
    'DC\.Date$' zu matchen. Versuchs vielleicht mal so:

    print eval('$attrvalue =~ /'.$regexp.'/ ? "yes" : "no"');

    Grüße,
     CK

    --
    Descartes sagte: 'Ich denke, also bin ich.' Ich hingegen sage: 'Ich denke nicht, also bin ich.'
    http://wwwtech.de/
    1. Hi Christian

      RegEx ist 'DC.Date$'? Und du wendest ihn via /$regexp/ an? Dann versucht er wohl auf
      'DC\.Date$' zu matchen. Versuchs vielleicht mal so:

      print eval('$attrvalue =~ /'.$regexp.'/ ? "yes" : "no"');

      So gehts. Nur verstehe ich nicht, warum der gleiche Regexp, also auch eingelesen und alles und gleich angewendet, ein paar Zeilen weiter oben bereits gematcht hat. Da hab ich jetzt auch ein Eval drum herum gemacht. Trotzdem würde mich interessieren, warum er teilweise gematcht hat, und teilweise nicht.

      Gruss Daniela

      1. Hallo Daniela,

        RegEx ist 'DC.Date$'? Und du wendest ihn via /$regexp/ an? Dann versucht er wohl auf
        'DC\.Date$' zu matchen. Versuchs vielleicht mal so:

        print eval('$attrvalue =~ /'.$regexp.'/ ? "yes" : "no"');

        So gehts. Nur verstehe ich nicht, warum der gleiche Regexp, also auch eingelesen und
        alles und gleich angewendet, ein paar Zeilen weiter oben bereits gematcht hat.

        Das ist eine Frage, die sich so nicht beantworten lässt. Dazu bräuchte ich (nachdem ich das
        Script selber ja bereits durchgesehen habe) ein Perl mit Debugging-Ausgaben.

        Grüße,
         CK

        --
        Der Verstand ist der Hausherr, der Koerper sein Gast.
        http://wwwtech.de/
  3. $attrvalue ist, wie an den Debugausgaben weiter unten zu sehen, korrekt abgefüllt, genauso $regexp. Trotzdem matcht beim zweiten File der Regexp nicht. Er scheitert an der 5. Bedingung.

    print "Content: " . $attrvalue . " Regexp: " . $regexp .  "\n";
    print "Vgl1: " . (defined $regexp)
          . " Vgl2: " . ($attribute_config->{type})
          . " Vgl3: " . ($attribute_config->{type} ne 'tag')
          . " Vgl4: " . ($attribute_config->{type} ne 'cont')
          . " Vgl5: " . ($attrvalue =~ /$regexp/) . "\n";

    File 1:
    Content: DC.Date Regexp: DC.Date$
    Vgl1: 1 Vgl2: content Vgl3: 1 Vgl4: 1 Vgl5: 1

    File 2:
    Content: DC.Date Regexp: DC.Date$
    Vgl1: 1 Vgl2: content Vgl3: 1 Vgl4: 1 Vgl5:

    Sieht jemand etwas, das ich übersehen habe?

    Das läßt sich natürlich schwer sagen, da man so keinen Testcase hat, sondern zwei absolut identische Skripte.

    Vielleicht solltest du die Ausgabe doch noch auf merkwürdige Zeichen checken:

    print "Content: *$attrvalue* Regexp: *$regexp*\n";

    Struppi.

    1. Hi Struppi

      Das läßt sich natürlich schwer sagen, da man so keinen Testcase hat, sondern zwei absolut identische Skripte.

      Das sind Testcases. Die Eingabe war identisch, die Ausgabe nicht. Warum ist unklar.

      Vielleicht solltest du die Ausgabe doch noch auf merkwürdige Zeichen checken:

      print "Content: *$attrvalue* Regexp: *$regexp*\n";

      Da waren wie gesagt keine.

      Christians eval-Lösung hat geholfen. Warum es in manchen Fällen vorher auch funktioniert hat, ist hingegen unklar.

      Gruss Daniela

      1. Das sind Testcases. Die Eingabe war identisch, die Ausgabe nicht. Warum ist unklar.

        Das läßt sich nicht nachvollziehen, weil wenn ich das versuchen wollte nachzubauen, bekomm ich natürlich 2 mal das Gleiche. Insofern wäre ein Testcode, der genau das macht was du sagst, hilfreich.

        Christians eval-Lösung hat geholfen. Warum es in manchen Fällen vorher auch funktioniert hat, ist hingegen unklar.

        eben, es bleibt einfach nur beim raten.

        Struppi.

        1. Hi Struppi

          Das läßt sich nicht nachvollziehen, weil wenn ich das versuchen wollte nachzubauen, bekomm ich natürlich 2 mal das Gleiche. Insofern wäre ein Testcode, der genau das macht was du sagst, hilfreich.

          Bei dem Script handelt es sich um den Indexer für die entstehende Selfsuche. Die Testdaten sind aktuell die komplette Selfhtml Dokumentation. Der Quellcode ist insgesamt über 700 Zeilen lang, die Konfigurationsdatei auch rund 100. Es ist also nicht machbar da um den Testfall aufzubauen, ein grosser Teil des Codes nötig ist. Aber wie gesagt, Christians Lösung war völlig richtig. Es hätte nur vorher überhaupt nicht funktionieren dürfen.

          Christians eval-Lösung hat geholfen. Warum es in manchen Fällen vorher auch funktioniert hat, ist hingegen unklar.

          eben, es bleibt einfach nur beim raten.

          Trotzdem ist dein Vorschlag nicht nützlich und einfach nicht zutreffend wie ich auch bereits Christian gegenüber erwähnt habe.

          Gruss Daniela

          1. Tschuldigung, das ich dir helfen wollte. Kommt nicht mehr vor.

            1. Tschuldigung, das ich dir helfen wollte. Kommt nicht mehr vor.

              Sorry das ich überreagiert habe. Ich fand es sehr frustrierend. Das Problem lies und lässt sich nicht auf weniger Zeilen zurückführen. Falls dich die Lösung und das ganze Script interessiert, es liegt im CVS: [http://cvs.teamone.de/cgi-bin/cvsweb.cgi/selfsuche/src/indexer/indexer.pl]
              Die Version 1.35 weist das Problem auf, die Version 1.36 nicht mehr.

              Gruss Daniela

              1. Tschuldigung, das ich dir helfen wollte. Kommt nicht mehr vor.

                Sorry das ich überreagiert habe. Ich fand es sehr frustrierend. Das Problem lies und lässt sich nicht auf weniger Zeilen zurückführen. Falls dich die Lösung und das ganze Script interessiert, es liegt im CVS: [http://cvs.teamone.de/cgi-bin/cvsweb.cgi/selfsuche/src/indexer/indexer.pl]

                Naja, hat ich mir gedacht, akzeptiert.

                Ich war auch frustriert, mir Gedanken über was zu machen, wo sowieso schon wenig und unzureichend Informationen da sind und dann auf den einzigen überhaupt möglichen Vorschlag - solang man nicht mehr über das Projekt oder den Quellcode weiß - gesagt zu bekommen das das nicht hilfreich ist.

                Struppi.

                1. Hi Struppi

                  Ich war auch frustriert, mir Gedanken über was zu machen, wo sowieso schon wenig und unzureichend Informationen da sind und dann auf den einzigen überhaupt möglichen Vorschlag - solang man nicht mehr über das Projekt oder den Quellcode weiß - gesagt zu bekommen das das nicht hilfreich ist.

                  Du, dazu stehe ich. Es ist äusserst arrogant zu sagen, es liegt an Sonderzeichen wenn bereits 2 Stunden vorher gesagt wurde, nein tut es nicht.

                  Gruss Daniela

                  1. Du, dazu stehe ich. Es ist äusserst arrogant zu sagen, es liegt an Sonderzeichen wenn bereits 2 Stunden vorher gesagt wurde, nein tut es nicht.

                    Naja, im gegensatz zu Christian, hab ich dir einfach nochmal dazu ein Stückchen Quellcode gegeben. Das war aus meiner Sicht die einzige Möglichkeit dir zu helfen. Da ich ausser den zwei Zeilen Code in deinem Ursprungsposting nichts hatte woran man erkennen konnte was falsch sein könnte.  Und ich hatte ja auch nachgefragt, eine Möglichkeit zu erhalten den Fehler irgendwie selber reproduzieren zu können. Lediglich aus dem Grunde weil es mich interessiert hat was da falsch läuft und weil ich mich mit deinem Problem auseinandergesezt habe.

                    Tja, wie schon gesagt, tut mir leid das ich helfen wollte, anscheinend war das nicht von dir gewünscht. Und da dir jemand geholfen hat, der wohl das Projekt woran du arbeitest kennt, war es von Anfang an sinnlos hier zu fragen. Aber dann tu bitte nicht die Leute anpflaumen die sinnloserweise versuchen dir zu helfen - sie können es nicht!

                    Struppi.

                  2. Du, dazu stehe ich. Es ist äusserst arrogant zu sagen, es liegt an Sonderzeichen wenn bereits 2 Stunden vorher gesagt wurde, nein tut es nicht.

                    klar arrogant.
                    Ich meine, mich arrogant zu betiteln, weil ich dir helfen wollte mit dem was du uns anbietest, das nicht ein Stückchen den Fehler erklärt, ist aus meiner Sicht eine Frechheit.

                    Zumal - ich habe noch mal gelesen was ich schrieb - mein Posting in erster Linie ein Versuch war mehr informationen zu bekommen. Wie gesagt mein Vorschlag - mit einem Stückchen konkretem Quellcode - war ledglich der Versuch aus den mageren Informationen etwas zu machen. Aber letztlich war der Zweck meines Posting einzig allein mehr Infos zu erhalten um dir helfen zu können.

                    Schließlich ist mein fehlgeschlagener Versuch einen Beitrag zu deinem Problem zu leisten nur ein Versuch, aber mir dann hinterher zu erklären das ich das auch stecken lassen kann und das ich arrogant wäre ist natürlich eine logische Schlußfolgerung. Wie kann ich nur so unhöflich sein überhaupt irgendwas vorzuschlagen, schließlich muss ja jeder die 7000 Zeilen Code kennen an denen du arbeitest.  Meinen falschen Vorschlag mir vorzuhalten um zu erklären das ein anderer Vorschlag, von jemanden der mehr über dein Projekt weiß, - zufälligerwiese -richtig war, ist dann natürlich eine logische Konsequenz.

                    Wie gesagt, ich entschuldige mich, dass ich versucht habe dir zu helfen, aber richte bitte in Zukunft deine Anfrage persönlich an die Leute von denen du wünscht dass sie dir helfen, bzw. die das Wissen, was man Wissen muss, um überhaupt in der Lage zu sein zu helfen. Du rufst damit weniger Frust bei Leuten hervor die nichts für deinen können.

                    Struppi.

  4. Hi Leute

    Falls es jemanden interessiert: der o-Modifier wirkt auf sämtliche Regexpen im gesamten Script. Sobald sämtliche o-Modifier von sämtlichen Regexpen entfernt waren, lief es auch ohne eval.

    Die o-Modifier sind bei Tuning-Versuchen reingekommen und hatten  bis ein dynamischer Regexp benutzt wurde uch ohne Nebenwirkungen funktioniert.

    Gruss Daniela

    1. Hallo Daniela,

      Falls es jemanden interessiert: der o-Modifier wirkt auf sämtliche Regexpen im gesamten
      Script.

      Nein, nicht prinzipiell. Interessanterweise hat sich herausgestellt, dass das ein Bug in
      Perl selber ist und die Doku recht hatte. Interessant wäre es, die genaueren Umstände
      herauszufinden. Mal sehen, ob ich die genauen Zusammenhänge auch noch herausfinde.

      Grüße,
       CK

      --
      Unsere Vorstellungen von der Ewigkeit sind genauso nuetlich wie die Mutmassungen eines Kuehkens ueber die Aussenwelt bevor es die Eierschale aufbricht.
      http://wwwtech.de/