web-dev-qa-db-fra.com

Comment utiliser les variables booléennes dans Perl?

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é.
213
Chad DeShon

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.

279
Alan Haggai Alavi

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:

  • La chaîne vide
  • Valeur numérique zéro
  • Une valeur indéfinie
  • Un objet avec un opérateur booléen surchargé qui évalue l'un des éléments ci-dessus.
  • Une variable magique qui correspond à l'un des éléments ci-dessus lors de l'extraction.

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.

  • Sans avertissement:
    • "0.0"
    • "0E0"
    • "00"
    • "+0"
    • "-0"
    • " 0"
    • "0\n"
    • ".0"
    • "0."
    • "0 but true"
    • "\t00"
    • "\n0e1"
    • "+0.e-9"
  • Avec un avertissement:
    • Toute chaîne pour laquelle Scalar::Util::looks_like_number renvoie false. (par exemple, "abc")
69
ikegami

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.

57
James Thompson

Je recommande use boolean;. Vous devez cependant installer le module boolean de cpan.

16
xenoterracide

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.

10
syck

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éfinie
  • 0 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 .

7
serenesat

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
5
Bharat

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.

0
user257319