undef en Perl

undef dans le langage de programmation Perl est l'une des valeurs qui peuvent être contenues dans une variable. Si vous n'affectez pas la valeur de la variable, alors la variable est undef.

Voici un exemple de programme Perl:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $var;
print Dumper $var;

$var = 123;
print Dumper $var;

$var = undef;
print Dumper $var;

Ce programme affiche:

$VAR1 = undef;
$VAR1 = 123;
$VAR1 = undef;

Tout d'abord, nous avons déclaré une variable, mais n'est pas donné à lui aucune valeur: my $var;. Plus loin à l'aide de print Dumper $var; , en déduit des informations sur l'importance de cette variable sur l'écran (vu que la variable contient undef). Après cela, nous avons attribué un nombre variable de 123et l'ont montré à l'écran. Et puis, à l'aide du code $var = undef; , nous avons donné à la variable undef et de nouveau dduit l'information sur ce sujet.

undef peut être un élément dans un tableau ou une valeur de hachage:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @arr = (1, undef, 'three');
print Dumper \@arr;

my %h = (
    a => undef,
);
print Dumper \%h;

Souvent undef est utilisé comme un drapeau spécial. Par exemple, peut être une fonction qui renvoie toujours le nombre, mais en cas d'erreur, retourne undef.

Le nom de undef vient du mot anglais undefined("non défini").

Que undef n'est pas

undef — c'est une valeur distincte. Ce n'est pas une chaîne 'undef', ce n'est pas une chaîne vide '' et ce n'est pas le nombre de 0. Tout cela est des valeurs différentes.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $var (undef, 'undef', '', 0) {
    print Dumper $var;
}

Dans le cas de hachage si la valeur de la clé undef n'est pas la même que dans le hachage est absent de cette clé.

Comment vérifier undef

Afin de vérifier si la valeur undef utilise la fonction defined. La valeur est undef si la fonction defined renvoie false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if (!defined($var)) {
    print 'var is undef';
}

Très facile d'écrire un sabu is_undef, qui va renvoyer la vérité si elle remis undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;

sub is_undef {
    my ($maybe_undef) = @_;
    return !defined($maybe_undef);
}

my @arr = (1, undef, 'three');

foreach my $el (@arr) {
    say is_undef($el) ? 'undef' : 'not undef';
}

Mais le plus souvent ne le font pas, et utilisent la fonction defined sans cerclage.

Il existe une autre façon que vous pouvez vérifier que la variable contient undef est utiliser l'opérateur ~~ (cet opérateur est appelé smartmatch). Cet opérateur est apparu dans Perl 5.10, mais à partir de la version de Perl 5.18 l'utilisation de cet opérateur émet un avertissement Smartmatch is experimental at script.pl line 8.. Voici un exemple de code avec cet opérateur:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var ~~ undef) {
    print 'var is undef';
}

Le plus souvent le meilleur moyen pour tester la undef est une fonction de defined.

Perl undef et de les convertir en JSON

De la bibliothèque pour travailler avec JSON en Perl convertissent Perl valeur undef dans null en JSON:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;

print encode_json {
    a => undef,
};

Ce code affichera {"a":null}.

Et au contraire, lors de la conversion de JSON null est undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;
use Data::Dumper;

print Dumper decode_json '[null]';

Ce code affiche:

$VAR1 = [
          undef
        ];

Fonction ref

Le résultat du travail de la fonction ref appliqué à undef est une chaîne vide ''. À cet égard, undef ne diffère pas des lignes et des nombres. Pour undef, lignes et numéros de fonction ref retourne une chaîne vide

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $el ('asdf', undef, 100) {
    print Dumper ref($el);
}

Une valeur booléenne

Lors de l'utilisation de undef dans la logique des opérations undef — c'est un mensonge. Ce code affiche l'écran de texte false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

if (undef) {
    print 'true';
} else {
    print 'false';
}

L'utilisation des chaînes

Dans ce cas, si l'utilisation de undef dans les opérations de chaîne, au lieu de undefsera être une chaîne vide '', mais aussi un avertissement est affiché.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print 'AAA' . $var . 'BBB';
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var eq '') {
    print 'equal';
} else {
    print 'not equal';
}

Dans le premier cas, un avertissement est affiché Use of uninitialized value in concatenation (.) or string at script.pl line 10., dans le second cas Use of uninitialized value in string eq at script.pl line 8..

Utilisation avec des nombres

Dans ce cas, si l'utilisation de undef dans les opérations avec les nombres, au lieu de undefsera utilisé le nombre de 0. mais un message d'avertissement s'affiche.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var + 4;
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var == 0) {
    print 'equal';
} else {
    print 'not equal';
}

Dans le premier cas, un avertissement est affiché Use of uninitialized value $var in addition (+) at script.pl line 8., dans le second cas Use of uninitialized value $var in numeric eq (==) at script.pl line 8..

Il est intéressant que lors de l'utilisation de l'opérateur d'incrémentation ++ avertissements non:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var++;

Thèmes connexes

Autres articles