J'ai essayé:
$var = false;
$var = FALSE;
$var = False;
Aucun de ces travaux. Je reçois le message d'erreur
Le mot clé "faux" n'est pas autorisé tant que "subs strict" est utilisé.
En Perl, les éléments suivants sont évalués à false dans les conditions:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
Le reste est vrai. Il n'y a pas de mots nus pour true
ou false
.
La définition la plus complète et concise de false que j'ai rencontrée est la suivante:
Tout ce qui affecte la chaîne vide ou la chaîne `0` est faux. Tout le reste est vrai.
Par conséquent, les valeurs suivantes sont fausses:
Gardez à l'esprit qu'un littéral de liste vide est évalué à une valeur non définie dans un contexte scalaire, il est donc évalué à quelque chose de faux.
ne note sur les "vrais zéros"
Tandis que les nombres précédés de 0
sont faux, les chaînes numérotées à zéro ne le sont pas nécessairement. Les seules fausses chaînes sont 0
et la chaîne vide. Toute autre chaîne, même si elle est égale à zéro, est vraie.
Ce qui suit sont des chaînes qui sont vraies comme un booléen et zéro comme un 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 false. (par exemple, "abc"
)Perl n'a pas de type booléen natif, mais vous pouvez utiliser la comparaison d'entiers ou de chaînes pour obtenir le même comportement. L'exemple d'Alan est une bonne façon de faire cela 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 ajoutée au 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 dans "use constant" définissent une constante nommée true qui évalue toujours la valeur 1 et une constante nommée false qui évalue toujours la valeur 0. En raison de la façon dont les constantes sont définies dans Perl, les lignes de code suivantes échouent également:
true = 0;
true = false;
Le message d'erreur doit indiquer quelque chose comme "Impossible de modifier la constante dans une affectation scalaire".
J'ai vu cela dans l'un des commentaires que vous avez demandé sur la comparaison de chaînes. Sachez que, du fait que Perl combine des chaînes et des types numériques dans des variables scalaires, vous avez une syntaxe différente pour comparer les chaînes 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.
Je recommande use boolean;
. Vous devez cependant installer le module boolean de cpan.
Mes favoris ont toujours été
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
qui est complètement indépendant de la représentation interne.
Je suis tombé sur un tutoriel qui explique bien les valeurs true et false en Perl . Il déclare que:
Les valeurs scalaires suivantes sont considérées comme fausses:
undef
- la valeur indéfinie0
le nombre 0, même si vous l'écrivez en tant que 000 ou 0,0''
la chaîne vide.'0'
la chaîne qui contient un seul chiffre 0.Toutes les autres valeurs scalaires, y compris les suivantes, sont vraies:
1
tout numéro autre que 0' '
la chaîne avec un espace'00'
deux ou plusieurs 0 caractères d'une chaîne"0\n"
a 0 suivi d'une nouvelle ligne'true'
'false'
oui, même la chaîne 'false' est évaluée à true.Il existe un autre bon tutoriel qui explique environ Perl true et false .
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
utilisez le préfixe de fichier suivant, cela ajoutera à votre script Perl eTRUE et eFALSE, ce sera réellement REAL (!) true et false (tout comme Java)
#!/usr/bin/Perl
use strict;
use warnings;
use constant { #real true false, compatible with encode_json decode_json for later (we don't want field:false... will be field:0...)
eTRUE => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
eFALSE => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' )
};
En fait, il y a peu de raisons pour utiliser cela.
Ma raison est que, travaillant avec JSON, j'ai 0 et 1 comme valeurs pour les clés, mais ce hack garantira que les valeurs correctes sont conservées dans votre script.