J'ai essayé :
$var = false;
$var = FALSE;
$var = False;
Aucun d'entre eux ne fonctionne. Je reçois le message d'erreur
Bareword "false" not allowed while "strict subs" is in use.
J'ai essayé :
$var = false;
$var = FALSE;
$var = False;
Aucun d'entre eux ne fonctionne. Je reçois le message d'erreur
Bareword "false" not allowed while "strict subs" is in use.
Êtes-vous autorisé à faire ce qui suit en Perl ? $var = ( $var1 eq $var2 ) ; Cela se fait tout le temps en C. Comment cela fonctionne-t-il en Perl ?
La définition la plus complète et la plus concise de faux que j'ai trouvée est la suivante :
Tout ce qui correspond à une chaîne vide ou à une chaîne de caractères.
0
est faux. Tout le reste est vrai.
Par conséquent, les valeurs suivantes sont fausses :
Gardez à l'esprit qu'une liste littérale vide est évaluée à une valeur indéfinie dans un contexte scalaire, donc elle est évaluée à quelque chose de faux.
Note sur les "vrais zéros".
Alors que les nombres qui s'enchaînent à 0
sont fausses, les chaînes qui se numérisent à zéro ne le sont pas nécessairement. Les seules chaînes de caractères fausses sont 0
et la chaîne vide. Toute autre chaîne, même si elle est numérisée à zéro, est vraie.
Voici des chaînes de caractères qui sont vraies en tant que booléen et nulles en tant que nombre :
"0.0"
"0E0"
"00"
"+0"
"-0"
" 0"
"0\n"
".0"
"0."
"0 but true"
"\t00"
"\n0e1"
"+0.e-9"
Scalar::Util::looks_like_number
renvoie faux. (par exemple "abc"
)
Si je vous ai bien compris le mot vrai sur Alors que les nombres qui tendent vers 0 sont vrais devrait être faux ou (pour éviter toute confusion) évaluer à faux .
Votre définition "concise" est incompatible avec votre explication plus longue. Considérez : my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
. Maintenant $value
se transformera en "XXX" mais se transformera en faux.
@tobyink, La version concise n'est pas parfaite, simplement la meilleure que j'ai trouvée. Elle est censée être pratique, pas exhaustive. Notez que la valeur renvoyée par votre bool
se transforme en 0
. En outre, il est déconseillé de créer des surcharges incohérentes, et les valeurs que vous renvoyez pourraient être considérées comme telles. (par exemple, une &&
peut être optimisé en un ||
donc si elles étaient incohérentes, vous auriez un problème).
Perl ne possède pas de type booléen natif, mais vous pouvez utiliser la comparaison d'entiers ou de chaînes de caractères pour obtenir le même comportement. L'exemple d'Alan est une bonne façon de le faire en utilisant la comparaison d'entiers. Voici un exemple
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
Une chose que j'ai faite dans certains de mes programmes est d'ajouter le même comportement en utilisant une constante :
#!/usr/bin/perl
use strict;
use warnings;
use constant false => 0;
use constant true => 1;
my $val1 = true;
my $val2 = false;
print $val1, " && ", $val2;
if ( $val1 && $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
print $val1, " || ", $val2;
if ( $val1 || $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
Les lignes marquées par "use constant" définissent une constante nommée true qui vaut toujours 1, et une constante nommée false qui vaut toujours 0. En raison de la manière dont les constantes sont définies en Perl, les lignes de code suivantes échouent également :
true = 0;
true = false;
Le message d'erreur devrait dire quelque chose comme "Can't modify constant in scalar assignment".
J'ai vu cela dans l'un des commentaires que vous avez demandé sur la comparaison des cordes. Vous devez savoir que parce que Perl combine des chaînes de caractères et des types numériques dans des variables scalaires, vous avez une syntaxe différente pour comparer les chaînes de caractères et les nombres :
my $var1 = "5.0";
my $var2 = "5";
print "using operator eq\n";
if ( $var1 eq $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
print "using operator ==\n";
if ( $var1 == $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
La différence entre ces opérateurs est une source de confusion très courante en Perl.
Il est dangereux d'utiliser les constantes comme des macros de pauvre type de cette façon. Ces exemples de code ne sont pas équivalents : if ($exitstatus) { exit; }
vs if ($exitstatus == true) { exit; }
ce qui n'est pas forcément évident pour un simple observateur. (Et oui, le dernier exemple est un mauvais style de programmation, mais ce n'est pas le sujet).
Je recommande use boolean;
. Vous devez installer le boolean de cpan cependant.
En Perl, comme dans la vie, il y a beaucoup de vérités. Les personnes inexpérimentées aiment écrire des choses stupides comme if ($my_true_value == true)
. Prétendre qu'il n'existe qu'une seule vérité vraie est, d'après mon expérience, un chemin vers la douleur et un code inefficace.
Belle explication donnée par bobf pour les valeurs booléennes : Vrai ou Faux ? Un guide de référence rapide
Tests de vérité pour différentes valeurs
Result of the expression when $var is:
Expression | 1 | '0.0' | a string | 0 | empty str | undef
--------------------+--------+--------+----------+-------+-----------+-------
if( $var ) | true | true | true | false | false | false
if( defined $var ) | true | true | true | true | true | false
if( $var eq '' ) | false | false | false | false | true | true
if( $var == 0 ) | false | true | true | true | true | true
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
41 votes
Vous pourriez commencer par lire mon livre Apprendre Perl . C'est plus facile que de deviner ce qu'il faut faire jusqu'à ce qu'on y arrive (les singes, les machines à écrire, Hamlet, etc.) :)