Comment vérifier que le Perl variable contient undef

De la tâche. Dans le code de la langue de programmation Perl, il est variable. Vous devez vérifier si la valeur de cette variable undef ou non.

Solution

Dans la variable contient undef uniquement si la fonction defined pour cette variable renvoie false. Voici le code qui affiche le texte si la variable contient undef:

▶ Run
#!/usr/bin/perl

my $foo;

if ( !defined($foo) ) {
    print "foo is undef";
}

De mauvaises décisions

Pour vérifier si undef dans la variable devez utiliser defined. Mais souvent qu'à undef utilisent d'autres, de mauvaises façons.

Voici le premier exemple comme il ne faut pas faire:

▶ Run
#!/usr/bin/perl

my $foo;

if ( !$foo ) { # error!
    print "foo is undef";
}

Cet exemple affiche vraiment une chaîne foo is undef si la variable d' $foo contient la valeur de undef, mais le code affiche cette ligne et dans les autres cas. Par exemple, si $foo contient un nombre 0 ou une chaîne vide ''. Ce code n'est pas vérifier que $foo contient undef, et la vérification de la $foo contient la valeur de mensonge, et il n'est absolument pas la même chose que undef.

Voici un autre exemple erronée de la vérification sur undef:

▶ Run
#!/usr/bin/perl

my $foo;

if ( $foo == undef ) { # error!
    print "foo is undef";
}

Ici, tout est complètement faux. Si la variable d' $foo contient la valeur undef, ce code affiche ligne foo is undef, mais le code affiche cette ligne et dans les autres cas. Par exemple, si la variable $foocontient ligne 'Hello'.

L'opérateur == est conçu pour comparer des nombres. Avant de produire la comparaison de cet opérateur convertit vos arguments en nombre. La variable $foo dans lequel se trouve le undef est le nombre de 0. Et undef à droite de l'opérateur devient aussi le nombre de 0. Zéro égale zéro la condition est déclenchée. Mais zéro sont en quelques lignes, par exemple 'Hello'.

Si vous ajoutez ce code use strict; et use warnings;, alors Perl affiche une chaîne de foo is undef, mais aussi un rapport sur ce qui se passe quelque chose d'étrange:

Use of uninitialized value in numeric eq (==) at script.pl line 8.
Use of uninitialized value $foo in numeric eq (==) at script.pl line 8.
foo is undef

Mais en général, c'est toujours une très bonne pratique de toujours utiliser use strict; et use warnings;.

Thèmes connexes

Autres articles