Brauche kleine Hilfe bei Verarbeitung eines Text-Strings
Alexander
- perl
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
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!
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
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
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 ,)
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
$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
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
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
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
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 ,)
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
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