Aquariophile: Entweder - Oder (Aber Nicht beides!!!)

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....

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 !

Meine Frage:

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

  1. 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

    1. Hallo Aquariophile,
      Nutze "Exklusives Oder":
      Operator: xor
      Beispiel: doit() if $a xor $b
      Bye,
      Manyak Online

  2. 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

    1. 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!

      1. 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

        1. 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!

      2. 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

        1. 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!

      3. 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

  3. 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

  4. 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

    1. 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

      1. 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 ...)

        1. 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