Alexander: Brauche kleine Hilfe bei Verarbeitung eines Text-Strings

Hallo,

ich habe mir aus dem Internet ein Suchmaschinen-Script geladen, daß ich meinen Bedürfnissen anpassen möchte. Man gibt in einem Textfeld (name="terms") die Suchbegriffe, getrennt durch Kommatas ein. Mittels Radio-Buttons wählt man die logische Verknüpfung (OR oder AND) aus.
Ich möchte nun aber, daß man schon im Testfeld für die Suchbegriffe die logische Verknüpfung mit angeben kann.

Daher suche ich nun eine Routine, die den Suchbegriffstring nach AND oder OR durchsucht und dann den Wert in die Variabele $boolean schreibt.

Es ist bei dieser Routine wichtig, daß sie nur dann $boolean "setzt", wenn AND oder OR als einzelnes Wort vorkommen. Im Klartext:

Suchbegriffe soll "cgi AND html" sein. --> $boolean = "AND"

Suchbegriffe soll "cgi OR html" sein. --> $boolean = "OR"

Suchbegriffe soll "cgi AND Text OR html" sein. --> $boolean soll nicht gesetzt werden

Suchbegriffe soll "ORbital" sein. --> $boolean soll nicht gesetzt werden

Ich danke schon allen, die sich mit den sicherlich wüst und kompliziert erscheinenden Sachverhalt auseindersetzen und hoffe, daß ich eine Lösung finden werden.

Bis dann...

Alexander

  1. hi!

    Es ist bei dieser Routine wichtig, daß sie nur dann $boolean "setzt", wenn AND oder OR als einzelnes
    Wort vorkommen. Im Klartext:
    Suchbegriffe soll "cgi AND html" sein. --> $boolean = "AND"
    Suchbegriffe soll "cgi OR html" sein. --> $boolean = "OR"
    Suchbegriffe soll "cgi AND Text OR html" sein. --> $boolean soll nicht gesetzt werden
    Suchbegriffe soll "ORbital" sein. --> $boolean soll nicht gesetzt werden

    Ich würde wohl ungefähr folgendes machen:

    === cut ===
    my $boolean = 0;
    if ($var =~ /\sand\s/i) { $boolean++; }
    if ($var =~ /\sor\s/i) { $boolean--; }
    === cut ===

    $boolean ist jetzt +1, wenn _nur_ AND vorkommt, -1, wenn _nur_ OR vorkommt, und 0 in allen anderen
    Fällen. Wenn du willst, kannst du das ja dann mit einfachen if-Abfragen in "and" und "or" umwandeln.  Ich
    hoffe, das funktioniert und du kannst damit was anfangen.

    bye, Frank!

    1. Ich hoffe, das funktioniert und du kannst damit was anfangen.

      bye, Frank!

      Boah, das ging aber schnell :)

      Ja, das hat mich auf die richtige Idee gebracht.
      Mein Denkfehler war, daß ich erstmal alle Suchbegriffe, getrennt durch ein Leerzeichen in einer Liste speichern wollte und dann die Liste nach AND bzw. OR durchsuchen wollte. Da ich aber nicht ganz so fit in Sachen Perl bin (ich habe eigentlich gar keine Ahnung...), habe ich es auch nicht hinbekommen, diese Liste zu durchsuchen.

      Getreu dem Motto: "Warum einfach wenns auch schwierig geht"

      Der Weg, den kompletten String zu durchsuchen ist ja auch viel einfacher.

      Danke!

      Alexander

  2. Hi!

    Seit gestern kann ich ein wenig Perl...
    Darum erdreiste ich mich mal, zu antworten.

    Das sollte eigentlich klappen (vorausgesetzt, es gibt die ganzen Variablen, die ich benutze, falls man uses strict hat.)

    $wort="cgi AND html" (oder sowas)

    if $wort~=/ OR / {$orgesetzt = 1;} else {orgesetzt=0;}
    if $wort~=/ AND / {$andgesetzt = 1;} else {andgesetzt=0;}

    if ($orgesetzt XOR $andgesetzt)
    {
    if ($andgesetzt) $boolean = "AND";
    else
    $boolean = "OR";
    }
    else
    $boolean="";

    Gruesse,

    <img src="http://outpost.purespace.de/mozilla.jpg" alt="">

    Bio

    1. Hi,

      Seit gestern kann ich ein wenig Perl...
      Darum erdreiste ich mich mal, zu antworten.

      Setzen, 6 *g*

      $wort="cgi AND html" (oder sowas)

      if ($wort~=/ OR /) { $orgesetzt = 1; } else { $orgesetzt=0; }

      #      ^                   ^                                   ^

      if ($wort~=/ AND /)  { $andgesetzt = 1; } else { $andgesetzt=0; }

      #      ^                     ^                                       ^

      if ($orgesetzt ^ $andgesetzt)

      #                      ^

      {
      if ($andgesetzt) { $boolean = "AND"; }

      #                          ^                            ^

      else {

      #          ^

      $boolean = "OR";
      }

      }

      else {

      #          ^

      $boolean="";

      }

      Aber vom Prinzip her gehts... auch wenn ein wenig umständlich *g*

      mfg
      CK1

      P.S.: nicht allzu ernst nehmen ,)

      1. Sup!

        P.S.: nicht allzu ernst nehmen ,)

        Nein... ich doch nicht...

        aber wenn Du Dich erdreistet mich zu korrigieren, dann könntest Du mir armen Perl-Anfänger ruhig sagen, was alles falsch ist... <span style="display:none">Du Wurst!</span>

        *gg*

        Bio

    2. $wort="cgi AND html" (oder sowas)

      if $wort~=/ OR / {$orgesetzt = 1;} else {orgesetzt=0;}
      if $wort~=/ AND / {$andgesetzt = 1;} else {andgesetzt=0;}

      Es muss natuerlich

      if ($wort =~/ OR /) $orgesetzt = 1; else orgesetzt=0,
      if ($wort~=/ AND /) $andgesetzt = 1; else andgesetzt=0;

      heissen... wie peinlich.
      Der Rest muesste aber stimmen... sonst poste ich nochmal :-)

      if ($orgesetzt XOR $andgesetzt)
      {
      if ($andgesetzt) $boolean = "AND";
      else
      $boolean = "OR";
      }
      else
      $boolean="";

      Gruesse,

      <img src="http://outpost.purespace.de/mozilla.jpg" alt="">

      Bio

      1. Hi Bio!

        if $wort~=/ OR / {$orgesetzt = 1;} else {orgesetzt=0;}
        if $wort~=/ AND / {$andgesetzt = 1;} else {andgesetzt=0;}

        Es muss natuerlich

        if ($wort =~/ OR /) $orgesetzt = 1; else orgesetzt=0,
        if ($wort~=/ AND /) $andgesetzt = 1; else andgesetzt=0;

        heissen... wie peinlich.

        Schade, schon wieder falsch. ;-) In Perl duerfen die geschweiften Klammern naemlich nicht einfach so weggelassen werden wie in JS oder C. Der Perl-Autor meinte, dadurch irgendeinen Konflikt vermeiden zu koennen, der angeblich auftreten kann, wenn man die Klammern weglassen koennte. Aber warum machst Du's nicht einfach so:

        $or = ($wort =~ / OR /) ? 1 : 0;
        $and = ($wort =~ / AND /) ? 1 : 0;

        Der Rest muesste aber stimmen... sonst poste ich nochmal :-)

        if ($orgesetzt XOR $andgesetzt)

        xor muss kleingeschrieben werden. Es geht aber auch so (tested):

        $boolean = ($and && !$or && 'AND') || ($or && !$and && 'OR') || "";

        (In perldoc perlop Abschnitt Synopsis stehen die Precedence rules, deren Kenntnis einem mitunter viele Klammern sparen kann. (In diesem Fall koennte man uebrigens *alle* Klammern weglassen, aber das ist der Uebersichtlichkeit imho auch nicht gerade zutraeglich.))

        So long

        1. Sup!

          Schade, schon wieder falsch. ;-) In Perl duerfen die geschweiften Klammern naemlich nicht einfach so weggelassen werden wie in JS oder C. Der Perl-Autor meinte, dadurch irgendeinen Konflikt vermeiden zu koennen, der angeblich auftreten kann, wenn man die Klammern weglassen koennte. Aber warum machst Du's nicht einfach so:

          Damit bestätigst Du immerhin meine Theorie, nach der das zumindest in C (und JS) total okay wäre, die Klammern wegzulassen.
          Vielleicht sollte ich das Perl lernen doch eher zuhause als im Forum machen? Obwohl so immerhin die Frager der Fragen zu aussergewöhlich ausfuerhlichem Anschauungsunterricht in "Perl - SO nicht!" und "Perl für Ultratrickige" kommen ;-)

          $or = ($wort =~ / OR /) ? 1 : 0;
          $and = ($wort =~ / AND /) ? 1 : 0;

          So tricky bin ich halt nicht :-)

          xor muss kleingeschrieben werden. Es geht aber auch so (tested):

          $boolean = ($and && !$or && 'AND') ($or && !$and && 'OR') "";

          Und ultratricky erstmal überhaupt gar nicht. Erstmal rausfinden, was der Quatsch heissen soll - sieht nach völlig abgespaceter Perl-Helden-Spezial-Syntax aus...  uiuiui...

          Grüße,

          Bio

          1. Moin!

            Erstmal rausfinden, was der Quatsch heissen soll - sieht nach völlig abgespaceter Perl-Helden-Spezial-Syntax aus...  uiuiui...

            Genaugenommen ist es die Extended outer-regions-junction-point shiver-club final hero mix version.

            So long

        2. Hi Calocybe,

          Schade, schon wieder falsch. ;-) In Perl duerfen die
          geschweiften Klammern naemlich nicht einfach so weggelassen
          werden wie in JS oder C. Der Perl-Autor meinte, dadurch
          irgendeinen Konflikt vermeiden zu koennen, der angeblich
          auftreten kann, wenn man die Klammern weglassen koennte.

          Der Konflikt liegt in der Zuordnung der else-Sätze. Zur Anschauung:

          if (ausdruck1)
            if(ausdruck2)
              tu_was;
          else
            tu_was_anderes;

          Von der Einrückung her ist das klar, wenn der 1. if-Satz NICHT
          erfüllt ist, dann soll else ausgeführt werden. Der Compiler aber
          ignoriert die White-Space-Zeichen - er ordnet das else dem ersten
          freien if zu, in diesem Fall if(ausdruck2).
          Das würde dann so ausgeführt:
          wenn ausdruck1, dann
             wenn ausdruck2, dann mach was, ansonsten mach was anderes.

          Wenn man das umschreibt in

          if(ausdruck1)
          {
          if (ausdruck2)
            { mach_was; }

          } else {
          mach_was_anderes;
          }

          ist das ganze absolut eindeutig. Das war der Konflikt, den der
          Autor vermeiden wollte ,)

          mfg
          CK1

          P.S.: ich weiß nicht, wie das in JavaScript/JScript ist, aber in C ist
          es so ,)

          1. Hi CK!

            Von der Einrückung her ist das klar, wenn der 1. if-Satz NICHT
            erfüllt ist, dann soll else ausgeführt werden. Der Compiler aber
            ignoriert die White-Space-Zeichen - er ordnet das else dem ersten
            freien if zu, in diesem Fall if(ausdruck2).

            Eben, und da das kein Geheimnis ist, ist doch die Sache eindeutig. Klar kann jemand Probleme kriegen, der das nicht weiss, aber das waere so, als ob ich deutsch spreche und nicht weiss, was der Unterschied zwischen "heute" und "morgen" ist. Jedenfalls rechtfertigt es imho nicht den Zwang dazu, die Curlies *immer* verwenden zu muessen. Gerade Perl, wo Perl doch dem Programmierer angeblich soviel Stil-Freiheit gibt...

            So long

            1. Hi Calocybe,

              aber das waere so, als ob ich deutsch spreche und nicht
              weiss, was der Unterschied zwischen "heute" und "morgen"
              ist.

              Also, das seh ich etwas anders. Meiner Meinung nach ist das
              eine semantische Feinheit der Sprache, etwa als wenn man "dem"
              statt "des" nach wegen verwendet. (wegen dem Wetter oder wegen
              des Wetters).
              So was machen sehr viele Leute falsch, genau wie ich sehr viele
              Leute kenne, die das NICHT wissen - und trotzdem in C
              programmieren können.

              Gerade Perl, wo Perl doch dem Programmierer angeblich soviel
              Stil-Freiheit gibt...

              Naja, ZU viel Freiheit ist auch nicht gut - ein paar Richtilinien sollten
              schon gegeben sein ,)

              mfg
              CK1