Perl Booleans, Negation (und wie man es erklärt)?

7

Ich bin neu hier. Nachdem ich gelesen habe, wie man fragt und formatiert, hoffe ich, dass dies eine gute Frage sein wird. Ich bin nicht sehr gut in Perl, aber es ist die Programmiersprache, die ich am meisten kenne.

Ich versuche, Perl ins wirkliche Leben zu bringen, aber ich habe kein großes Verständnis bekommen - besonders nicht von meiner Frau. Ich sage es ihr:

  

Wenn sie mir abends keine 3 Biere bringt, bedeutet das, dass ich null (oder nichts) Biere bekomme.

Wie Sie wahrscheinlich vermutet haben, ohne viel Erfolg. : (

Jetzt sachlich. Von perlop :

  

Unary "!" führt logische Verneinung durch, dh "nicht".

Sprachen, was boolean Typen hat (was nur zwei "Werte" haben kann) ist OK:

  

wenn es nicht der eine Wert ist - & gt; muss der andere sein.

so natürlich:

%Vor%

Aber Perl hat nicht boolean Variablen - haben nur ein truth system , während alles nicht 0 , '0' undef , '' ist TRUE. Problem tritt auf, wenn logische Negation auf einen nicht logischen Wert angewendet wird, z. Zahlen.

z. Wenn eine Zahl NICHT 3 ist, bedeutet das, dass sie IS ZERO oder leer ist, anstelle der wirklichen Leben Bedeutung, wo, wenn etwas NICHT 3 ist, es kann bedeuten, dass alles andere als 3 ist (zB null).

Also der nächste Code:

%Vor%

druckt:

%Vor%

Außerdem:

%Vor%

Was ist nicht nicht 4 IS 1 anstelle von 4!

Die obigen Aussagen mit Frau sind "falsch" (Mittelwert 0) :), aber wirklich versuchen, meinen Sohn zu unterrichten Perl und er, nach einer Weile, fragte meine Frau: warum, wenn etwas ist nicht 3 bedeutet es ist 0? .

Also sind die Fragen:

  • wie ich das meinem Sohn erklären kann
  • warum Perl diesen Entwurf hat, also warum !0 ist immer 1
  • Ist hier etwas "hinter" was erfordert als !0 ist keine Zufallszahl , sondern 0.
  • wie schon gesagt, ich kenne keine anderen sprachen - in jeder sprache ist !3 == 0 ?
elfiress 05.07.2013, 14:16
quelle

4 Antworten

11

Ich denke, Sie konzentrieren sich zu sehr auf Negation und zu wenig darauf, was Perl booleans bedeuten.

Historische / Implementationsperspektive

Was ist Wahrheit? Die Erkennung einer höheren Spannung, die x Volt.

Auf einer höheren Abstraktionsebene: Wenn dieses Bit hier gesetzt ist.

Die Abstraktion einer Bitfolge kann als Ganzzahl betrachtet werden. Ist diese Ganzzahl falsch? Ja, wenn kein Bit gesetzt ist, d. H. Die Ganzzahl ist Null.

Eine Hardware-orientierte Sprache wird wahrscheinlich diese Definition der Wahrheit verwenden, z. C und alle C-Nachkommen incl. Perl.

Die Negation von 0 könnte eine bitweise Negation sein - alle Bits werden auf 1 - umgedreht, oder wir setzen das letzte Bit auf 1 . Die Ergebnisse würden normalerweise als Ganzzahlen -1 bzw. 1 dekodiert werden, aber letzteres ist energieeffizienter.

Pragmatische Perspektive

Es ist praktisch , an alle Zahlen zu denken, aber an null als wahr , wenn wir mit Zählungen umgehen:

%Vor%

oder

%Vor%

Eine pragmatische Sprache wie Perl wird wahrscheinlich Null für falsch halten.

Mathematische Perspektive

Es gibt keinen Grund dafür, dass irgendeine Zahl falsch ist, jede Zahl ist eine wohldefinierte Einheit. Wahrheit oder Falschheit entsteht allein durch Prädikate, Ausdrücke, die wahr oder falsch sein können. Nur dieser Wahrheitswert kann negiert werden. ZB

%Vor%

ist falsch. Viele Sprachen, die eine starke mathematische Grundlage haben, werden nichts falsches, sondern einen speziellen falschen Wert betrachten. In Lisps ist '() oder nil normalerweise falsch, aber 0 ist normalerweise wahr. Das heißt, ein Wert ist nur wahr, wenn er nicht null ist!

In solchen mathematischen Sprachen ist !3 == 0 wahrscheinlich ein Typfehler.

Re: Bier

Bier ist gut. Eine beliebige Anzahl von Bieren ist gut, solange Sie eine haben:

%Vor%

Boolifizierung einer Bierzählvariablen sagt uns nur, ob Sie irgendwelche Biere haben. Betrachten Sie !! als einen Boolifikationsoperator:

%Vor%

Die boolification beschäftigt sich nicht mit der genauen Menge. Aber vielleicht ist eine Zahl ≥ 3 gut. Dann:

%Vor%

Die Negation ist nicht genug Bier:

%Vor%

oder

%Vor%

Sets

Ein Perl-Skalar symbolisiert kein ganzes Universum von Dingen. Insbesondere ist not 3 nicht die Menge aller Entitäten, die nicht drei sind. Ist der Ausdruck 3 ein truthy Wert? Ja. Daher ist not 3 ein falscher Wert.

Das vorgeschlagene Verhalten von 4 == not 3 als wahr ist wahrscheinlich unerwünscht: 4 und "alle Dinge, die nicht drei sind" sind nicht gleich , die Vier ist nur eines von vielen Dingen, die es gibt nicht drei. Wir sollten es richtig schreiben:

%Vor%

oder

%Vor%

Es kann hilfreich sein, an ! und not als logische Negation-of zu denken, aber nicht an außer .

Wie man

unterrichtet

Es könnte sich lohnen, mathematische Prädikate einzuführen: Ausdrücke, die wahr oder falsch sein können. Wenn wir Wahrheit nur durch explizite Tests, z. length($str) > 0 , dann treten Ihre Probleme nicht auf. Wir können die Ergebnisse benennen: my $predicate = (1 < 2) , aber wir können entscheiden, sie niemals auszudrucken, stattdessen: print $predicate ? "True" : "False" . Dies vermeidet das Problem, spezielle Darstellungen von true oder false zu berücksichtigen.

Wenn Werte direkt als wahr / falsch betrachtet werden, wäre dies nur eine Abkürzung, z. foo if $x kann als Verknüpfung für

betrachtet werden %Vor%

Bei Perl dreht sich alles um Shortcuts.

Das Unterrichten dieser Verknüpfungen und die verschiedenen Kontexte von Perl und wo sie auftauchen (numerische / string / boolsche Operatoren) könnte hilfreich sein.

  • Listenkontext
    • Listenkontext in gleichmäßiger Größe
  • Skalarer Kontext
    • Numerischer Kontext
    • String-Kontext
    • Boolescher Kontext
  • Kontinuierlicher Kontext
amon 05.07.2013, 15:30
quelle
8
  
  • wie schon gesagt, ich kenne keine anderen Sprachen - in jeder Sprache ist das! 3 == 0?
  •   
  • Ja. In C (und damit C ++) ist es dasselbe.

    %Vor%

    Drucke (siehe Ссылка )

    %Vor%
  
  • wie ich das meinem Sohn erklären kann
  •   
  • Sehr einfach. !3 bedeutet "Gegenteil von einige nicht-falscher Wert, was natürlich falsch ist". Dies wird "Kontext" genannt - in einem booleschen Kontext, der durch den Negationsoperator auferlegt wird, ist "3" NICHT eine Zahl, es ist eine Aussage von wahr / falsch.

    Das Ergebnis ist auch keine "Null", sondern nur etwas, das bequem ist Perl-Darstellung von false - die in einem numerischen Kontext zu einer Null wird (aber eine leere Zeichenfolge, wenn in einem String-Kontext verwendet wird - siehe den Unterschied zwischen 0 + !3 und !3 . "a" )

      

    Der boolesche Kontext ist nur eine spezielle Art von skalarem Kontext, in dem niemals eine Umwandlung in eine Zeichenkette oder eine Zahl durchgeführt wird. ( perldoc perldata )

  
  • warum Perl diesen Entwurf hat, also warum! 0 ist immer 1
  •   
  
  • Ist hier etwas "hinter", was erfordert! 0 ist keine Zufallszahl, sondern 0.
  •   
  • Nichts außer Einfachheit der Implementierung. Es ist einfacher, eine "1" als eine Zufallszahl zu erzeugen.

  • Wenn Sie eine andere Frage von "warum ist es 1 statt der ursprünglichen #, die negiert wurde, um 0 zu bekommen", die Antwort darauf ist einfach - zu der Zeit Perl-Interpreter kann diese Null negieren, er weiß nicht mehr, / merkt sich, dass Null ein Ergebnis von "! 3" im Gegensatz zu einem anderen Ausdruck war, der zu einem Wert von Null / Falsch führte.

DVK 05.07.2013 14:32
quelle
3

Wenn Sie testen möchten, dass eine Zahl nicht 3 ist, verwenden Sie Folgendes:

%Vor%

Mit der Syntax !3 , da ! ein boolescher Operator ist, wird zuerst 3 in einen booleschen Wert konvertiert (obwohl perl möglicherweise keinen offiziellen booleschen Typ hat, funktioniert es immer noch so), was Da es nicht Null ist, bedeutet dies, dass es in das Äquivalent von true konvertiert wird. Dann liefert !true false , was, wenn zurück in einen Ganzzahlkontext konvertiert wird, 0 ergibt. Die Fortsetzung dieser Logik zeigt, wie !!3 3 in true umwandelt, das dann in false invertiert wird, wieder in true invertiert wird und, wenn dieser Wert in einem Integer-Kontext verwendet wird, in% konvertiert wird. Code%. Dies gilt für die meisten modernen Programmiersprachen (obwohl vielleicht nicht einige der logikzentrierten), obwohl die genaue Syntax je nach Sprache variieren kann ...

    
twalberg 05.07.2013 14:47
quelle
0

Wenn Sie einen falschen Wert logisch negieren, müssen Sie einige -Werte auswählen, um den resultierenden wahren Wert darzustellen. "1" ist so gut wie jede andere. Ich würde sagen, es ist nicht wichtig, welcher Wert zurückgegeben wird (oder umgekehrt, es ist wichtig, dass Sie sich nicht darauf verlassen, dass ein bestimmter wahrer Wert zurückgegeben wird).

    
chepner 05.07.2013 14:21
quelle

Tags und Links