Perl et les booléens

Date de publication:
Durée de lecture estimée:

Contrairement à d'autres langages de haut niveau, Perl ne dispose pas d'un type de donnée dédié à la représentation des valeurs booléennes. Dans ce billet, je vous propose de découvrir comment il les gère nativement et d'utiliser la librairie boolean pour rendre votre code plus expressif.

Une variable booléenne représente une valeur logique correspondant à l’état vrai (true) ou à l’état faux (false). A l’aide d’opérateurs logiques tels que et (and), ou (or) ou encore la négation (not), il est possible de définir des conditions complexes qui seront utilisées par les structures de contrôle. Autant dire que ces booléens sont indispensables pour utiliser les tests (if ou unless) ou des structures de contrôle (while, until, etc.).

Les valeurs vraies et fausses en Perl

En l’absence d’un type booléen dans le langage, Perl utilise un certain nombre de règles pour définir si une valeur est vraie ou fausse. Tout d’abord, il y a plusieurs valeurs qui sont considérées comme étant des valeurs fausses :

  • le contenu n’est pas défini (undef),
  • une chaine vide ou une chaine de caractères avec la valeur '0',
  • les valeurs 0 ou 0.0.

A contrario, Perl considére qu’une valeur est vraie si :

  • elle contient une donnée,
  • la valeur est différente d’une chaine de caractères vide ou ne contient pas uniquement un zéro,
  • elle représente un nombre dont la valeur est différente de zéro

Expérimentons cela avec un petit bout de code :

foreach my $value (undef,0,0.0,'','0','hello',42) {
    if($value) {
        print "$value : TRUE\n";
    } else {
        print "$value FALSE\n";
    }
}

Un tableau est considéré vrai s’il contient au moins un valeur. Bizarrement, si un tableau reçoit la valeur undef, il est considéré comme étant initialisé par Perl et retourne donc la valeur true.

use 5.010;

my @t1 = undef;
my @t2 = ();
my @t3 = (1);

if(@t1) {
    say '@t1 TRUE'
};

if(@t2) {
    say '@t2 TRUE'
};

if(@t3) {
    say '@t3 TRUE'
};

En executant ce bout de code, vous pouvez constater que seuls les tableaux @t1 et @t3 retournent la valeur vrai lors de l’évaluation de l’expression. Le comportement est identique avec les tables de hachage.

Intégration de la librairie boolean

La gestion des valeurs booléennes est d’assez bas niveau dans Perl. Elle se rapproche de celle du langage C dans lequel il est très courant de trouver des définitions de constantes telles que :

#define TRUE 1
#define FALSE 0

Bien évidemment, nous pouvons faire de même avec Perl en utilisant la directive constant.

use constant TRUE => 1;
use constant FALSE => 0;

C’est simple mais il y a moyen de faire mieux. Il suffit pour cela de chercher un peu dans le CPAN. Le module boolean est justement conçu pour ajouter des booléens à Perl. Il ne se contente pas de définir des constantes. Les valeurs booléennes sont représentées à l’aide d’objets qui exposent plusieurs méthodes utilitaires bien pratiques.

La librairie boolean ne fait pas partie des modules par défaut installés avec Perl. Pour l’essayer, il faut donc la récupérer à partir du CPAN. Faisons cela proprement à l’aide de Carton en rédigeant tout d’abord un tout petit fichier cpanfile :

requires "boolean" => "0.46";

Utilisez la commande carton install afin de télécharger et d’installer la dernière version du module boolean. Nous pouvons maintenant intégrer le module boolean à notre code code Perl à l’aide de la directive use.

Pour exécuter un script Perl exploitant des librairies installées à l’aide de Carton, il est nécessaire d’utiliser l’option exec (par exemple: carton exec perl monscript.pl) et prendre ainsi en compte le dépôt local dans les chemins de recherche.

A partir de maintenant, les valeurs true et false sont ajoutées au langage sous la forme d’objets. L’exemple suivant définit une variable contenant la valeur true et une fonction retournant la valeur false. Le message “ok” apparaît à l’écran en fonction du contenu de la variable $value et de la valeur retounée par la fonction foo().

use strict;
use warnings;
use 5.010;
use boolean ':all';

my $value = true;

sub foo {
    return false;
}

if($value) {
    if(!foo()) {
        say "ok";
    }
}

Le module boolean exporte également quelques fonctions utilitaires pratiques pour manipuler des valeurs booléennes. La fonction boolean() retourne un booléen en fonction de la valeur scalaire qui lui est passée en paramètre. Ainsi par exemple, l’instruction boolean('0') retourne la valeur false.

Les fonctions isTrue() et isFalse() permettent de tester la valeur d’un booléen et améliorent la lisibilité du code.

if(isTrue($value)) {
    say 'La valeur est true';
}

Enfin, la fonction isBoolean() retourne true si le scalaire passé en paramêtre est un objet boolean::true ou un objet boolean::false.

if(isBoolean(false)) {
    say "c'est un booleen";
}

Pas totalement obligatoire mais carrément pratique, le module boolean est un excellent complément à Perl. Il démontre que ce langage est évolutif par l’ajout de modules et personnalisable selon les desideratas des développeurs.