Perl booleans, negation (und, wie man es erklären)?
Ich bin neu hier. Nach der Lektüre über wie zu Fragen, und format, ich hoffe es wird ein OK-Frage. Ich bin nicht sehr bewandert in perl, aber es ist die Programmiersprache, ich kenne die meisten.
Ich versuche gelten Perl realen Leben, aber ich habe nicht bekommen, eine große Verständnis - vor allem nicht von meiner Frau. Ich sage Ihr, dass:
wenn Sie nicht bringen Sie mir 3 Bier am Abend, das heißt, ich habe null (oder nichts) Biere.
Wie Sie wahrscheinlich erraten, ohne viel Erfolg. 🙁
Nun sachlich. Von perlop:
Unär "!" führt eine logische negation, also "nicht".
Sprachen, was haben boolean
Typen (was kann haben nur zwei "Werte") ist OK:
wenn es nicht der ist, den Wert -> muss die anderen.
so natürlich:
!true -> false
!false -> true
Aber perl nicht boolean
Variablen besitzen nur eine truth system
, whrere alles ist nicht 0
, '0'
undef
, ''
WAHR ist. Problem kommt, wenn die Anwendung logische negation zu einem nicht logischen Wert z.B. zahlen.
E. g. Wenn eine gewisse Anzahl NICHT 3, das ist meine, es NULL oder leer ist, wird stattdessen der realen Leben Sinn, wo, wenn etwas NICHT 3, bedeuten, kann es sein nichts, aber 3 (z.B. null auch).
Also das nächste code:
use 5.014;
use Strictures;
my $not_3beers = !3;
say defined($not_3beers) ? "defined, value>$not_3beers<" : "undefined";
say $not_3beers ? "TRUE" : "FALSE";
my $not_4beers = !4;
printf qq{What is not 3 nor 4 mean: They're same value: %d!\n}, $not_3beers if( $not_3beers == $not_4beers );
say qq(What is not 3 nor 4 mean: @{[ $not_3beers ? "some bears" : "no bears" ]}!) if( $not_3beers eq $not_4beers );
say ' $not_3beers>', $not_3beers, "<";
say '-$not_3beers>', -$not_3beers, "<";
say '+$not_3beers>', -$not_3beers, "<";
Drucke:
defined, value><
FALSE
What is not 3 nor 4 mean: They're same value: 0!
What is not 3 nor 4 mean: no bears!
$not_3beers><
-$not_3beers>0<
+$not_3beers>0<
Außerdem:
perl -E 'say !!4'
was ist nicht nicht 4 IST 1, statt 4!
Die obigen Aussagen mit der Frau von "falschen" (Mittelwert 0) :), aber wirklich versucht beizubringen, mein Sohn Perl-und er, nach einer Weile, fragte meine Frau: , warum, wenn etwas nicht 3 meine, es ist 0 ? .
Also die Fragen sind:
- wie ist das zu erklären, mein Sohn,
- warum perl hat das design, also warum
!0
ist immer 1 - Ist hier etwas "hinter", was erfordert, als
!0
ist nicht Zufallszahl, aber 0. - wie ich schon sagte, ich weiß nicht, auch in anderen Sprachen - und das in jeder Sprache ist
!3 == 0
?
- Ich fühle mich wie es ist eine tief greifende argument Versuch gemacht werden, den ich hier einfach nicht, um zu sehen, was es ist.
- werde versuchen, das perl-Logik mit meiner Frau & Bier 🙂
- Ich habe nicht hatte keine drei Bier. Heißt das, ich habe vier Bier?
- Vermutlich Ihre Frau mit überladenen
!
Betreiber. 🙂 Check dieoverload::Overloaded $beer
. - Die
!
Betreiber gilt für Boolesche Werte. Der Ausdruck!3
ist eine Kurzform für!(3 != 0)
die eingeklammerten Ausdruck, welcher die implizite Boolesche Wert wird negiert. Da(3 != 0)
wahr ist oder 1, seine negation ist 0 oder false. Das ist, warum!3 == !4
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie konzentrieren sich zu sehr auf die negation und zu wenig auf das, was Perl Boolesche Werte bedeuten.
Historische/Umsetzung Perspektive
Was ist Wahrheit? Der Nachweis eines höheren Spannung x Volt.
Auf einer höheren Abstraktionsebene: Wenn dieses bit hier wird gesetzt.
Die Abstraktion einer Sequenz von bits kann als eine ganze Zahl. Ist diese integer falsch? Ja, wenn kein bit gesetzt ist, d.h. die ganze Zahl ist null.
Einer hardware-orientierten Sprache wird wahrscheinlich diese definition von Wahrheit, z.B. C und alle C-Abkömmlinge inkl Perl.
Die negation der
0
könnte bitweise negation—alle bits werden umgedreht1
—, oder setzen wir einfach das Letzte Stück bis1
. Die Ergebnisse würden in der Regel decodiert werden als Ganzzahlen-1
und1
jeweils, aber der letztere ist, mehr Energie effizient.Pragmatische Perspektive
Ist es bequem zu denken, alle zahlen, aber null wahr, wenn wir uns befassen sich mit zählt:
oder
Einer pragmatischen Sprache wie Perl wahrscheinlich betrachten Sie null als falsch.
Mathematischen Perspektive
Gibt es keinen Grund für irgendeine Zahl falsch, jede Zahl ist eine gut definierte Entität. Wahrheit oder Falschheit entsteht allein durch Prädikate, Ausdrücke, die true oder false sein kann. Nur diese Wahrheit Wert kann negiert werden. E. g.
ist falsch. Viele Sprachen, die eine starke Basis in der Mathematik nicht berücksichtigen, alles falsch, aber einen besonderen Wert false. In Lisps,
'()
odernil
ist meistens falsch, aber0
wird in der Regel wahr. Das heißt, dass ein Wert, der nur wahr ist, wenn es nicht null!In solchen mathematischen Sprachen
!3 == 0
ist eher ein Typ-Fehler.Re: Biere
Biere sind gut. Eine beliebige Anzahl von Biere sind gut, solange Sie eine haben:
Boolification einer Bier-zähl-variable zeigt nur, dass Sie uns, wenn Sie irgendwelche Biere. Betrachten
!!
eine boolification Betreiber:Den boolification nicht Sorge sich mit dem genauen Betrag. Aber vielleicht kann eine beliebige Anzahl ≥ 3 gut ist. Dann:
Die negation ist nicht genug Bier:
oder
Sets
Einen Perl-Skalar symbolisiert nicht ein ganzes Universum der Dinge. Vor allem,
not 3
ist nicht die Menge aller Entitäten, die nicht drei. Ist der Ausdruck3
eine truthy Wert? Ja. Dahernot 3
ist ein falsey Wert.Dem vorgeschlagenen Verhalten
4 == not 3
um wahr zu sein ist wahrscheinlich unerwünscht:4
und "alle Dinge sind nicht drei" sind nicht gleich, die vier ist nur eine von vielen Sachen, die sind nicht drei. Sollten wir korrekt schreiben:oder
Könnte es helfen, zu denken
!
undnot
als logische negation -, aber nicht als außer., Wie zu lehren
Könnte es sich lohnen, Einführung in die mathematische Prädikate: Ausdrücke, die true oder false sein kann. Wenn wir immer nur "schaffen" truthness von expliziten tests, wie z.B.
length($str) > 0
, dann sind Ihre Probleme nicht entstehen. Wir können den Namen für die Ergebnisse:my $predicate = (1 < 2)
, aber wir können entscheiden, nie drucken Sie Sie aus, stattdessen:print $predicate ? "True" : "False"
. Dies umgeht das problem der Berücksichtigung spezieller Darstellungen von wahr oder false.Anbetracht Werte true/false-direkt würde dann nur eine Verknüpfung, z.B.
foo if $x
kann als eine Abkürzung fürPerl ist alles über shortcuts.
Unterricht diese Verknüpfungen und die verschiedenen Kontexte von perl-und wo Sie auftauchen (numerisch/string/boolean-Operatoren) könnte hilfreich sein.
boolean
variable und dieboolean operations
. Perl hat keine bool-variable, aber tun boolsche Operationen. Danke.Ja. In C (und damit auch C++), ist es das gleiche.
Drucke (siehe http://codepad.org/vOkOWcbU )
Sehr einfach.
!3
bedeutet "Gegenteil von einige nicht-falschen Wert, das ist natürlich falsch". Dies wird als "Kontext" - in einem booleschen Kontext, auferlegt durch negation operator", "3" ist KEINE Zahl, es ist eine Aussage von true/false.Das Ergebnis ist auch nicht eine "null", sondern lediglich etwas, das ist bequem, Perl-Darstellung falsch, die verwandelt sich in eine null, wenn Sie in einem numerischen Kontext (aber ein leerer string, falls verwendet, in einem string-Kontext - sehen Sie den Unterschied zwischen
0 + !3
und!3 . "a"
)Siehe oben. Unter anderen möglichen Gründen (obwohl ich nicht weiß, ob das war Larry der Hauptgrund), C hat die gleiche Logik und Perl nahm viel seiner syntax und Ideen von C.
Für eine SEHR gute zugrunde liegende technische Details, siehe hier die Antworten: "Was tun Perl-Funktionen return Boolean tatsächlich zurück "und hier:" Warum macht Perl mit der leeren Zeichenfolge darstellen, die den booleschen Wert false? "
Nichts, abgesehen von der Einfachheit der Umsetzung. Es ist einfacher zu produzieren, die eine "1" als eine Zufallszahl.
wenn Sie Fragen, eine verschiedenen Frage "warum ist es 1 anstelle der original - # das war annulliert zu bekommen 0", die Antwort ist einfach - durch die Zeit, die Perl-interpreter bekommt, zu negieren, dass die null, die es nicht mehr kennt/erinnert sich, dass zero war ein Ergebnis von "!3" im Gegensatz zu einigen anderen Ausdruck, der ergab einen Wert von null/false.
Wenn Sie möchten, um zu testen, ob eine Zahl ist nicht 3, dann verwenden Sie diesen:
Mithilfe der syntax
!3
, da!
ist ein boolescher operator, zuerst konvertiert3
in einen booleschen (obwohlperl
kann nicht eine offizielle boolean-Typ, es funktioniert immer noch so), welche, da ist es nicht null ist, bedeutet, es wird umgewandelt, um das äquivalent vontrue
. Dann!true
Erträgefalse
, die umgewandelt zurück zu einem integer-Kontext, gibt0
. Weiterbildung mit dieser Logik zeigt, wie!!3
wandelt3
zutrue
, die dann invertiert zufalse
, invertiert wieder zurücktrue
, und wenn dieser Wert in einem integer-Kontext, wird umgewandelt zu1
. Dies gilt für die meisten modernen Programmiersprachen (obwohl vielleicht nicht einige der mehr Logik-zentriert sind), obwohl die genaue syntax variieren etwas je nach der Sprache...Logisch negiert einen false-Wert erfordert einige Wert gewählt werden, um die Darstellung der so erhaltenen wahren Wert. "1" ist eine ebenso gute Wahl wie jede andere. Ich würde sagen, es ist nicht wichtig, welcher Wert zurückgegeben (oder Umgekehrt, ist es wichtig, dass Sie sich nicht auf einen bestimmten Wert true zurückgegeben wird).