Question

j'ai essayé:

$var = false;
$var = FALSE;
$var = False;

Aucun de ceux-ci ne fonctionne. Je reçois le message d'erreur

Bareword "false" not allowed while "strict subs" is in use.
Était-ce utile?

La solution

En Perl, les éléments suivants sont évalués comme étant faux 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 .

Autres conseils

La définition la plus complète et concise des faux que j'ai rencontrée est la suivante:

Tout ce qui est lié à 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 renvoie 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.

Une note sur les "vrais zéros"

Alors que les nombres qui renvoient 0 sont faux, les chaînes qui correspondent à zéro ne le sont pas nécessairement. Les seules chaînes fausses sont 0 et la chaîne vide. Toute autre chaîne, même si elle est égale à zéro, est vraie.

Les chaînes suivantes sont vraies en tant que booléen et zéro en tant que nombre.

  • Sans avertissement:
    • "0.0"
    • "0E0"
    • "00"
    • "+ 0"
    • "-0"
    • " 0 "
    • "0 \ n"
    • ".0"
    • "0."
    • "0 mais vrai"
    • "\ t00"
    • "\ n0e1"
    • "+ 0.e-9"
  • Avec un avertissement:
    • Toute chaîne pour laquelle 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 un bon moyen 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 "Utiliser constante" définissez une constante nommée true qui évalue toujours à 1 et une constante nommée false qui évalue toujours par 0. En raison de la manière 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 du type "Impossible de modifier la constante dans l'affectation scalaire".

J'ai vu cela dans l'un des commentaires que vous avez posé sur la comparaison de chaînes. Sachez que, dans la mesure où 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 d'utiliser boolean; . Vous devez installer le module boolean de cpan si.

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 contient une bonne explication sur les valeurs true et false dans Perl . Il indique 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: (true):

  • 1 tout numéro autre que 0
  • '' la chaîne contenant 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 didacticiel expliquant le Perl true et faux .

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 lesquelles vous devriez utiliser cela.

Si je travaille avec JSON, j’ai 0 et 1 comme valeurs de clés, mais ce hack garantira que les valeurs correctes sont conservées tout au long de votre script.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top