235 votes

Comment utiliser les variables booléennes en Perl ?

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.

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.) :)

298voto

Alan Haggai Alavi Points 34260

En Perl, les éléments suivants valent false dans les conditionnels :

0
'0'
undef
''  # Empty scalar
()  # Empty list
('')

Les autres sont vrais. Il n'y a pas de mots nus pour true ou false .

0 votes

La comparaison correcte est-elle alors une comparaison avec zéro, comme dans $var=0 ?

0 votes

Non. 1. = n'est pas une comparaison, c'est une affectation. 2. Faites "if ($var) {...}".

1 votes

Ê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 ?

75voto

ikegami Points 133140

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 :

  • 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 est évaluée à l'un des éléments ci-dessus lors de la récupération.

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 :

  • 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 faux. (par exemple "abc" )

0 votes

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 .

2 votes

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.

1 votes

@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).

61voto

James Thompson Points 15464

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.

6 votes

use warnings; au lieu de #! perl -w

11 votes

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).

16voto

xenoterracide Points 2557

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

7 votes

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.

2 votes

Perl est philosophique par nature

7voto

Bharat Points 86

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

0 votes

Réponse médiocre, mais une source solide et réputée en perlmonks.org. Ce serait bien d'avoir de vrais contenu au lieu d'un commentaire et d'un lien. :-/

Prograide.com

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.

Powered by:

X