Entweder - Oder (Aber Nicht beides!!!)
Aquariophile
- perl
Hallo !
Mein Problem das ich heute habe,
könnte man fast als philosophische Frage ansehen,
ist aber ein _echtes_ Problem das ich lösen muss um weiter programmieren zu können.
Also, bevor ich eine Zeile Source poste,
mache ich ein Beispiel aus dem "realen" Leben.
Eine Mutter kommt mit Zwei Äpfeln nach Hause,
einem grünen und einen roten Apfel.
Sie fragt Max,
welchen Apfel er will.
---!!!!---
Den Grünen Apfel ODER den Roten ??
---!!!---
Nun kann sich Max für EINEN der beiden entscheiden,
ENTWEDER grün, ODER rot,
aber _nicht_ beide.
^^^ Exakt das ist wichtig,
Entweder oder, aber nicht beide....
if (($test eq "2") || ($test =~ /^\d+$/)) { ... }
Wenn (($test 2 ist) ODER ($test eine Natürliche Zahl ist)) { ... }
-----
Seht ihr das Problem?
Max kann sich für den roten _oder_ den grünen Apfel entscheiden.
Gesetzt den Fall $test enthält 4.
Diese obige IF-Abfrage ist TRUE,
weil 4 ist eine natürliche Zahl,
auch wenn es nicht 2 ist,
aber da es eine Natürliche Zahl ist, wird es True.
Wenn $test aber 2 enthält....
Dann treffen Beide zu. (Problem !)
-!!- Dann würde Max nicht entweder grün Oder rot nehmen,
-!!- sondern Beide Äpfel !
Wie sage ich,
wenn ich die Zeichen && || kombinieren will?
Weil in diesem Fall,
wenn $test 2 enthält,
wäre es ja eine && aussage,
und wenn es 4 enthält eine || aussage,
und die ODER-Aussage ist ja eigentlich falsch weil beide richtig sind wenn $test 2 ist.
Beispiel was ich _vermute_
$test = "2";
if (($test eq "2") && ($test =~ /^\d+$/)) { ... } # TRUE, weil ja beide zutreffen dürfen (&&)
if (($test eq "2") || ($test =~ /^\d+$/)) { ... } # FALSE, weil nur entweder oder geht, aber nicht beides.
Ich hoffe ich habe euch nicht verwirrt,
bitte sagt mir ob meine Denkweise stimmt und wie man so etwas löst......
Besten Dank und
Liebe Grüße,
Aquariophile
Hi,
Ich hoffe ich habe euch nicht verwirrt,
Doch, ziemlich! Vielleicht wärs doch besser, wenn du das ganze nicht mit Äpfeln sondern anhand eines konkreten Beispiels erläuterst, du weisst ja, hier treiben sich viele Informatiker rum, bzw. Leute die viel mit Computern zu tun haben. Die können sich aus höheren abstraktionsebenen leichter einen Reim machen. Aber die Apfelebene ist eindeutig ein bissl zuuuuuu abstrakt - für mich jedenfalls;-)
bitte sagt mir ob meine Denkweise stimmt und wie man so etwas löst......
was ich dir sagen kann, ist dass du eine Zahl (2) wie einen String abfragst.
Strings - > eq
Zahlen -> ==
Da ersparst dir schon mal die regex, denn wenn $test keine Zahl ist, kommt nie und nimma ein true zurück.
Vielleicht hat dir das ja schon weitergeholfen, wenn nicht, sorry, aber ich steig da aus, ist mir zu hoch ;-)
lg bernhard
Hallo Aquariophile,
Nutze "Exklusives Oder":
Operator: xor
Beispiel: doit() if $a xor $b
Bye,
Manyak Online
Hallo Aquarophile!
Wenn man sich mit Sprache beschäftigt, unterscheidet man zwischen exklusivem und nicht-exklusivem ODER. Will sagen: ODER ist nicht gleich ODER.
Beispiel Exklusiv: es ist schwarz oder weiß (eine Möglichkeit schließt die andere aus, es kann ENTWEDER schwarz ODER weiß sein)
Ein Beipiel eines nicht-exklusiven ODER fällt mir beim besten Willen heute abend nicht ein, aber mir ist auch im Bezug auf Perl aufgefallen, dass die ODER-Abfragen nicht exklusiv zu sein scheinen... Was sagen die Experten?
Patrick
hi!
Wenn man sich mit Sprache beschäftigt, unterscheidet man zwischen
exklusivem und nicht-exklusivem ODER. Will sagen: ODER ist nicht
gleich ODER.
Exklusives Oder ist ja nicht unbedingt so offentlich. Es bedeutet,
dass eine der Alternativen von der jeweils anderen ausgeschlossen
wird, also ein "entweder ... oder", auch Antivalenz genannt.
Ein Beipiel eines nicht-exklusiven ODER fällt mir beim besten
Willen heute abend nicht ein,
Das ist daher so schwierig, da im deutschen mit dem "oder" eigentlich
ein "entweder ... oder" gemeint ist. Ein Satz wie "das Auto ist rot
oder ein Diesel" wäre ein Beispiel, macht aber wohl für die meisten
überhaupt keinen Sinn. Jedenfalls schließen sich beide Alternativen
nicht gegenseitig aus, in dem Fall weder semantisch noch syntaktisch.
aber mir ist auch im Bezug auf Perl aufgefallen, dass die ODER-
Abfragen nicht exklusiv zu sein scheinen... Was sagen die
Experten?
Man will auch standardmäßig kein Exklusives Oder haben, da dann -
abgesehen von evtl. anderen Nachteilen - auf jeden Fall die Ausdrücke
auf beiden Seiten ausgewertet werden müssen, natürlich zu lasten der
Effizienz.
Ein normales Oder ist in Perl entweder 'or' oder '||' (verschiedene
Priorität), 'xor' ist ein Exklusives Oder.
bye, Frank!
Hi!
Man will auch standardmäßig kein Exklusives Oder haben, da dann -
abgesehen von evtl. anderen Nachteilen - auf jeden Fall die Ausdrücke
auf beiden Seiten ausgewertet werden müssen, natürlich zu lasten der
Effizienz.
Das kann ich so nicht stehenlassen. Ein XOR ist etwas voellig anderes als ein OR. Da geht es nicht um Effizienzvorteile. Es hat einfach jedes seine eigene Funktion und wird dementsprechend eingesetzt, wenn es gebraucht wird. Richtig ist aber, dass beim XOR immer beide Seiten ausgewertet werden muessen, um das Ergebnis zu bestimmen, waehrend bei AND und OR das Ergebnis schon nach der Auswertung nur einer Seite feststehen kann.
Uebrigens kann man, falls man so ganz und gar kein xor zur Verfuegung hat, dieses nachbauen.
A xor B
ist aequivalent zu
(A and not(B)) or (not(A) and B)
Ist natuerlich bloed, weil dann A und B unter Umstaenden mehrfach ausgewertet werden, also fuer die Praxis eher sinnlos.
So long
hi!
Man will auch standardmäßig kein Exklusives Oder haben, da dann -
abgesehen von evtl. anderen Nachteilen - auf jeden Fall die Ausdrücke
auf beiden Seiten ausgewertet werden müssen, natürlich zu lasten der
Effizienz.
Das kann ich so nicht stehenlassen. Ein XOR ist etwas voellig
anderes als ein OR. Da geht es nicht um Effizienzvorteile.
Das wollte ich auch gar nicht sagen, sondern: meistens ist es egal,
ob man ein XOR oder ein OR verwendet, weil beide eingesetzt werden
könnten. Allerdings wäre in dem Fall ein XOR blödsinnig, weil es viel
weniger effizient ist.
Ist ja auch ganz egal. Ich hab ja nur auf das reagiert, was in dem
Ursprungsposting stand... ;)
bye, Frank!
Hallo Frank!
Danke für die Erläuterungen (auch an Calo für xor)...
Ein Satz wie "das Auto ist rot
oder ein Diesel" wäre ein Beispiel, macht aber wohl für die meisten
überhaupt keinen Sinn. Jedenfalls schließen sich beide Alternativen
nicht gegenseitig aus, in dem Fall weder semantisch noch syntaktisch.
Mir ist ein anderes Beispiel eingefallen, das ein nicht-exklusives Oder vielleicht eher verdeutlicht:
"Sie können gerne nach Frankfurt oder nach Mainz fahren: In beiden Städten gibt's überall Handkäs mit Musik!"
--> Sie können nach Frankfurt fahren, Sie können nach Mainz fahren, Sie können nach Frankfurt und nach Mainz fahren...
Patrick
hi!
Mir ist ein anderes Beispiel eingefallen, das ein nicht-exklusives
Oder vielleicht eher verdeutlicht:
"Sie können gerne nach Frankfurt oder nach Mainz fahren: In beiden
Städten gibt's überall Handkäs mit Musik!"
--> Sie können nach Frankfurt fahren, Sie können nach Mainz
fahren, Sie können nach Frankfurt und nach Mainz fahren...
Kein gutes Beispiel, weil man eben nicht gleichzeitig nach Frankfurt
und nach Mainz fahren kann. Man muss sich für eines entscheiden.
bye, Frank!
hi,
Das ist daher so schwierig, da im deutschen mit dem "oder" eigentlich
ein "entweder ... oder" gemeint ist.
Ich denke, daß der Sprachgebrauch von 'oder', so wie Du es meinst, mi dem logischen 'oder', so wie es meist in der Programmierung eingesetzt wird, relativ wenig zu tun hat.
Diese oft zitierten Oder-Fragen wie 'willst Du eine roten oder grünen Apfel?' stellen sich ja in der Programmierung etwas anders.
Da heißt es ja
wenn(wunsch = roter Apfel)
reagiere auf roten Apfel
oder wenn (wunsch = grüner Apfel)
reagiere auf grünen Apfel
(wobei dieses oder meist als 'else' geschrieben wird ;-))
Die oder-Abfragen in der Programmierung gehen eher in die Richtung
wenn(wunsch = beide oder reaktion = schmollen)
gibt es keinen Apfel
Und hier werden wirklich zwei unterschiedliche ereignisse geprüft.
Ein Satz wie "das Auto ist rot oder ein Diesel" wäre ein Beispiel, macht aber wohl für die meisten
überhaupt keinen Sinn.
Schon bei der Polizei:
Ist das Auto ist rot oder ein Diesel, dann wird eine Fahrzeugkontrolle durchgeführt!
Na vielleicht doch eher:
Sieht das Auto klapprig aus oder macht der Lenker einen betrunkenen Eindruck oder fehlen die Nummerntafeln ....
Na ja, ist nur so dahergedacht
Klaus
Hallo,
Eine Mutter kommt mit Zwei Äpfeln nach Hause,
einem grünen und einen roten Apfel.
Sie fragt Max,
welchen Apfel er will.
---!!!!---
Den Grünen Apfel ODER den Roten ??
---!!!---
Nun kann sich Max für EINEN der beiden entscheiden,
ENTWEDER grün, ODER rot,
aber _nicht_ beide.
Die Tatsächliche Perl-Frage:
if (($test eq "2") || ($test =~ /^\d+$/)) { ... }
Wenn (($test 2 ist) ODER ($test eine Natürliche Zahl ist)) { ... }
Seht ihr das Problem?
Max kann sich für den roten _oder_ den grünen Apfel entscheiden.
Gesetzt den Fall $test enthält 4.
Diese obige IF-Abfrage ist TRUE,
weil 4 ist eine natürliche Zahl,
auch wenn es nicht 2 ist,
aber da es eine Natürliche Zahl ist, wird es True.
Wenn $test aber 2 enthält....
Dann treffen Beide zu. (Problem !)
-!!- Dann würde Max nicht entweder grün Oder rot nehmen,
-!!- sondern Beide Äpfel !
IMHO, hinkt der Vergleich:
Oben schliesst das Eine, das Andere aus. Rot _ODER_ grün. Ein einfarbiger Apfel kann nicht beides sein.
$test kann aber sehr wohl eine 2 _UND_ eine natürliche Zahl sein, da 2 eine Untermenge von |N ist.
Evtl. möchtest Du so etwas:
if ($test == 2) { #foo }
elsif ($test =~ /^\d+$/) { #bar } # ?
Aber vielleicht ist es doch besser, Du erläuterst uns das noch mal anhand Deines konkreten Perlcodes.
Besten Dank und
Liebe Grüße,
Aquariophile
Gruß Kai
Hi,
Nun kann sich Max für EINEN der beiden entscheiden,
ENTWEDER grün, ODER rot,
aber _nicht_ beide.
Und auch nicht keinen von beiden. Das sind alle vier Fälle, die bei der
Kombination von zwei Variablen mit jeweils zwei möglichen Werten auftreten
können.
Du kannst eine Wahrheitstafel für Dein Problem aufstellen und für jede
Kombination eintragen, ob Deine kombinierte Aussage wahr oder falsch
sein soll:
| Apfel = rot | Apfel != rot |
--------------+-------------+---------------+
Apfel = grün | falsch | wahr |
--------------+-------------+---------------+
Apfel != grün | wahr | falsch |
--------------+-------------+---------------+
Damit bekommst Du die Wahrheitstafel für das Exklusive Oder.
Aber wenn Du genau hinschaust, hat diese Tafel noch eine zweite Eigen-
schaft, die Du nutzen kannst: Es sind genau diejenigen Einträge "wahr",
bei denen sich die Wahrheitswerte der Einzelaussagen *unterscheiden*.
Du kannst also transformieren:
(A xor B) ==> (A != B)
Für Sprachen, die keinen xor-Operator haben, ist das sehr hilfreich.
Viele Grüße
Michael
Hi!
Du kannst also transformieren:
(A xor B) ==> (A != B)
Für Sprachen, die keinen xor-Operator haben, ist das sehr hilfreich.
Genial! Ja ja, die einfachsten Dinge... :-)
So long
Hallo Calocybe,
Du kannst also transformieren:
(A xor B) ==> (A != B)
Für Sprachen, die keinen xor-Operator haben, ist das sehr hilfreich.
Genial! Ja ja, die einfachsten Dinge... :-)
hmpf, Du machst mir gerade bewußt, wie alt ich schon bin. ;-)
Als ich damals (vor langer, langer Zeit) Informatik studierte, da gab es
eine Vorlesung namens "Schaltwerktechnik" für Informatiker bzw. Daten-
techniker. Damals wurden CPUs nämlich nicht bei Intel bzw. AMD gekauft,
sondern von ein paar mehr Firmen noch richtig selbst entworfen. (Und von
den Studenten zumindest "mathematisch gebaut" - mit Lötkolben habe ich nix
am Hut.)
Und auf der Mikro-Ebene war es irgendwie so, daß man elektrisch bestimmte
logische Funktionen ziemlich gut herstellen konnte (NAND-Gatter etc.),
aber ganz einfache Dinge wie AND und OR leider nicht.
Also mußte man sich diejenigen Funktionen, die man eigentlich brauchte,
aus dem zusammenbasteln, was man so hatte - und dafür brauchte man eben
solche Transformationen (mit deren Wissen man dann wiederum Programme
schreiben konnte, um bestimmte Funktionen mit der minimalen Anzahl an ICs
zu realisieren usw. - wahrscheinlich machen das die verbliebenen Herstel-
ler heute immer noch so ähnlich).
Ach, das waren noch Zeiten, als wir damals Integer-Addierwerke auf Schalt-
werkebene beschrieben haben - heute lernen die Informatiker vermutlich,
wie man Windows 2000 installiert? Das "Telekolleg Informatik" in den III.
Programmen vermittelt jedenfalls M$ Office, habe ich irgendwo gesehen ...
Viele Grüße
Michael
(der in seiner Diplomarbeit eine Fujitsu-CPU emulieren durfte, die u. a.
ein Hardware-Register besaß, in welches man zwar Werte hineinschreiben,
aber aus diesem nicht wieder heraus lesen konnte - was Programm-Debugging
auf der Original-Hardware *etwas* umständlich gestaltete ...)
Moin!
hmpf, Du machst mir gerade bewußt, wie alt ich schon bin. ;-)
Na komm, was soll *ich* denn da sagen... ;-)
Und auf der Mikro-Ebene war es irgendwie so, daß man elektrisch bestimmte
logische Funktionen ziemlich gut herstellen konnte (NAND-Gatter etc.),
aber ganz einfache Dinge wie AND und OR leider nicht.
Stimmt, das hab ich vor vier Jahren auch noch gelernt - Ausbildung zum sog. Industrietechnologe fuer Datentechnik.
Ach, das waren noch Zeiten, als wir damals Integer-Addierwerke auf Schalt-
werkebene beschrieben haben -
Naja, ist ja nicht so, das wir das nicht mehr gemacht haetten. Das sind schliesslich die Grundlagen fuer das Verstaendnis von elektronischen Schaltungen, auch Computern. Ich finde, die Kenntnis dieser Grundlagen hat mir schon oft geholfen.
heute lernen die Informatiker vermutlich,
wie man Windows 2000 installiert?
Na das zum Glueck nicht, glaube ich. Noch heisst es Informatik und nicht Rechner konfigurieren. Und die Zahl derer, die vom ach so praxisfernen Inf-Studium enttaeuscht sind, weil sie dort nicht lernen, wie man einen Webserver aufsetzt, ist ja nach wie vor vorhanden (so ein Glueck, koennte man sagen *g*).
Das "Telekolleg Informatik" in den III.
Programmen vermittelt jedenfalls M$ Office, habe ich irgendwo gesehen ...
Uh-oh. Musst Du hier solche makabren Dinge posten? ;-(
So long