Perl booléens, la négation (et comment l'expliquer)?
Je suis nouveau ici. Après la lecture par le biais de la façon de poser et de format, j'espère que ce sera OK question. Je ne suis pas très habile en perl, mais c'est le langage de programmation que j'ai connu la plupart.
Que j'essaie d'appliquer Perl pour la vraie vie, mais je n'ai pas une grande compréhension - surtout pas de ma femme. Je lui dis que:
si elle n'a pas à me 3 bières dans la soirée, cela signifie que je suis zéro (ou rien) bières.
Comme vous l'avez probablement deviné, sans beaucoup de succès. 🙁
Maintenant dans les faits. De perlop:
Unaire "!" effectue une négation logique, c'est "non".
Langues, qu'avez - boolean
types (ce qui ne peut avoir que deux "valeurs") est OK:
si elle n'est pas une valeur -> doit être l'autre.
donc naturellement:
!true -> false
!false -> true
Mais perl n'a pas boolean
variables - n'ont qu'un truth system
, whrere tout n'est pas 0
, '0'
undef
, ''
est VRAI. Problème, lors de l'application de négation logique à un pas la valeur logique par exemple chiffres.
E. g. Si certains nombre n'EST PAS 3, c'est moyen, il EST ZÉRO ou vide, au lieu de la la vraie vie sens, où si quelque chose n'est PAS 3, dire qu'il peut être rien mais 3 (par exemple, zéro en trop).
Donc le code suivant:
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, "<";
imprime:
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<
En outre:
perl -E 'say !!4'
qu'est-ce que pas pas 4 EST 1, au lieu de 4!
Les déclarations ci-dessus avec la femme sont "faux" (moyenne de 0) :), mais vraiment essayer enseigner à mon fils Perl et il, après un moment, demandé à ma femme: pourquoi, si quelque chose n'est pas 3 moyenne elle est de 0 ? .
Donc les questions sont:
- comment expliquer cela à mon fils
- pourquoi perl a cette conception, alors pourquoi
!0
est à chaque fois 1 - Est ici quelque chose "derrière" ce qui implique que
!0
n'est pas tout nombre aléatoire, mais de 0. - comme je l'ai déjà dit, je ne sais pas bien d'autres langues, dans toutes les langues est
!3 == 0
?
vais essayer de faire en perl logique avec ma femme & bières 🙂
Je n'ai pas eu non pas trois bières. Est-ce que j'ai eu quatre bières?
Probablement votre femme à l'aide de surcharge
!
de l'opérateur. 🙂 La vérification de la overload::Overloaded $beer
.Le
!
opérateur s'applique à des valeurs booléennes. L'expression !3
est un raccourci pour !(3 != 0)
, la mise entre parenthèses de l'expression qui représente l'implicite valeur booléenne qui est niée. Parce que (3 != 0)
est vrai ou 1, sa négation est 0 ou false. C'est pourquoi !3 == !4
.OriginalL'auteur elfiress | 2013-07-05
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes en se concentrant trop sur la négation et trop peu sur ce que Perl booléens veux dire.
Historique/Perspective De Mise En Œuvre
Qu'est-ce que la vérité? La détection d'une tension plus élevée que x Volts.
Sur un plus haut niveau d'abstraction: Si ce bit est ici définie.
L'abstraction d'une séquence de bits peut être considéré comme un nombre entier. Est-ce integer faux? Oui, si aucun bit est défini, c'est à dire le nombre entier est égal à zéro.
Un matériel langage orienté va probablement utiliser cette définition de la vérité, par exemple C, et de tous les C descendants incl Perl.
La négation de
0
pourrait être la négation bit à bit—tous les bits sont retournés à1
—, ou nous vient de mettre la dernière touche à1
. Les résultats pourraient généralement être décodé comme des entiers-1
et1
respectivement, mais ce dernier est plus économe en énergie.Point De Vue Pragmatique
Il est pratique à penser de tous les numéros, mais zéro comme vrai lorsque nous traitons avec des comptes:
ou
Une pragmatique du langage comme Perl sera probablement envisager de zéro pour être faux.
Perspective Mathématique
Il n'y a aucune raison pour qu'un nombre soit faux, chaque numéro est une entité définie. De la vérité ou de la fausseté émerge uniquement par les prédicats, les expressions qui peuvent être vraies ou fausses. Seulement, cette valeur de vérité peut être niée. E. g.
est faux. De nombreuses langues qui ont une base solide en mathématiques à ne pas envisager quelque chose de faux, mais un spécial valeur false. Dans Lisps,
'()
ounil
est généralement faux, mais0
sera généralement vrai. C'est-à-dire, une valeur n'est vrai que si il n'est pas nul!Dans de tels mathématiques langues,
!3 == 0
est probablement une erreur de type.Re: Bières
Bières sont bonnes. N'importe quel nombre de bières sont bonnes, aussi longtemps que vous en avez un:
Boolification d'une bière de comptage variable juste dit nous si vous avez des bières. Envisager
!!
être un boolification opérateur:La boolification ne pas se préoccuper de la quantité exacte. Mais peut-être n'importe quel nombre ≥ 3 est bonne. Alors:
La négation n'est pas assez de bière:
ou
Ensembles
Perl scalaire ne symbolise tout un univers de choses. En particulier,
not 3
n'est pas l'ensemble de toutes les entités qui ne sont pas des trois. Est l'expression3
un truthy valeur? Oui. Par conséquent,not 3
est un falsey valeur.L'a suggéré le comportement de
4 == not 3
pour être vrai, c'est probablement pas souhaitable:4
et “toutes les choses qui ne sont pas des trois” ne sont pas l'égalité des, le quatre est juste une des nombreuses choses qui ne sont pas des trois. Nous devons l'écrire correctement:ou
Il peut aider à penser de
!
etnot
comme logique de la négation de, mais pas comme sauf.Comment enseigner
Il pourrait être intéressant d'introduire des mathématiques prédicats: les expressions qui peuvent être vraies ou fausses. Si nous n'en avons jamais “créer” truthness explicitement par des tests, par exemple
length($str) > 0
, vos problèmes ne surviennent. On peut citer les résultats:my $predicate = (1 < 2)
, mais nous pouvons décider de ne plus jamais les imprimer, au lieu de:print $predicate ? "True" : "False"
. Cette laisse de côté le problème de l'examen spécial des représentations de vrai ou faux.Compte tenu des valeurs true/false directement ne serait donc un raccourci, par exemple
foo if $x
peut être considéré comme un raccourci pourPerl est tout au sujet de raccourcis.
L'enseignement de ces raccourcis, et les différents contextes de perl et où qu'ils soient (numérique/string/opérateurs booléens) pourrait être utile.
boolean
variable et laboolean operations
. Perl n'a pas variable boolean, mais faire opérations booléennes. Je vous remercie.OriginalL'auteur amon
Oui. En C (et donc C++), c'est la même chose.
Imprime (voir http://codepad.org/vOkOWcbU )
Très simple.
!3
signifie "opposé de certains non-valeur false, ce qui est évidemment faux". Cela s'appelle le "contexte" - dans un contexte Booléen imposées par l'opérateur de négation, "3" n'est PAS un nombre, c'est une déclaration de vrai/faux.Le résultat n'est pas un "zéro", mais simplement quelque chose qui est pratique Perl représentation de la fausse - qui se transforme en un zéro si elle est utilisée dans un contexte numérique (mais une chaîne vide si elle est utilisée dans un contexte de chaîne - voir la différence entre
0 + !3
et!3 . "a"
)Voir ci-dessus. Parmi d'autres raisons (même si je ne sais pas si c'était de Larry raison principale), C est la même logique et Perl a pris beaucoup de sa syntaxe et les idées de C.
Pour une TRÈS bonne technique sous-jacente de détails, voir les réponses ici: "Que dois-Perl fonctions return Boolean retourne en fait "et ici:" Pourquoi Perl utilisez la chaîne vide pour représenter le booléen false valeur? "
Rien en dehors de la simplicité de mise en œuvre. Il est plus facile de produire un "1" que d'un nombre aléatoire.
si vous demandez à une différents question du "pourquoi est-il 1 la place de l'originale qui a été annulé pour obtenir 0", la réponse est simple - par le temps interpréteur Perl arrive à nier que zéro, il ne sait plus/se souvient que le zéro a été le résultat de "!3" plutôt que d'une autre expression qui a donné une valeur de zéro/faux.
Merci à toi aussi, beaucoup.
OriginalL'auteur DVK
Si vous voulez tester qu'un nombre n'est pas 3, puis de les utiliser:
L'aide de la syntaxe
!3
, depuis!
est un opérateur booléen, convertit3
dans un booléen (même siperl
ne peut pas avoir un type booléen, il fonctionne toujours de cette façon), qui, depuis elle est différente de zéro, signifie qu'il est converti à l'équivalent detrue
. Ensuite,!true
rendementsfalse
, qui, lors de sa conversion en nombre entier contexte, donne0
. Poursuivant cette logique montre comment!!3
convertit3
àtrue
, qui est ensuite inversée pourfalse
, inversée, de nouveau, de retour àtrue
, et si cette valeur est utilisée dans un nombre entier contexte, est converti en1
. Cela est vrai de la plupart des langages de programmation modernes (bien que peut-être pas le plus logique centrée sur l'), bien que la syntaxe exacte peut varier de quelques en fonction de la langue...OriginalL'auteur twalberg
Logiquement en niant la valeur false nécessite certains de la valeur choisie pour représenter la résultante de la valeur réelle. "1" est un bon choix comme un autre. Je dirais qu'il n'est pas important, la valeur renvoyée (ou, à l'inverse, il est important de ne pas s'appuyer sur une véritable valeur retournée).
OriginalL'auteur chepner