94 votes

En Perl, comment puis-je, de façon concise, vérifier si $variable est définie et contient une chaîne de longueur zéro?

J'utilise actuellement le Perl suivante pour vérifier si une variable est définie et contient du texte. Je dois vérifier defined d'abord pour éviter une "valeur non initialisée" avertissement:

if (defined $name && length $name > 0) {
    # do something with $name
}

Est-il mieux (sans doute plus concis) méthode pour écrire cela?

89voto

brian d foy Points 71781

Vous voyez souvent le vérifier definedness de sorte que vous n'avez pas à traiter avec l'avertissement pour l'utilisation d'une valeur undef (et en Perl 5.10, il vous indique la délinquance de la variable):

 Use of uninitialized value $name in ...

Donc, pour obtenir autour de cet avertissement, les gens viennent avec toutes sortes de code, et que le code commence à ressembler à une partie importante de la solution plutôt que du bubble-gum et du ruban adhésif qu'il est. Parfois, il est préférable de montrer ce que vous faites explicitement à la désactivation de l'avertissement que vous essayez d'éviter:

 {
 no warnings 'uninitialized';

 if( length $name ) {
      ...
      }
 }

Dans d'autres cas, utiliser une sorte de valeur null à la place des données. Avec Perl 5.10 définies ou opérateur, vous pouvez donner des length explicite d'une chaîne vide (définis, et de donner en retour de longueur zéro) au lieu de la variable qui va déclencher l'alerte:

 use 5.010;

 if( length( $name // '' ) ) {
      ...
      }

En Perl 5.12, c'est un peu plus facile parce qu' length sur une valeur non définie également retourne undefined. Cela peut sembler un peu de la bêtise, mais ce qui plaît le mathématicien que je l'aurais voulu être. Qui n'a pas d'émettre un avertissement, qui est la raison de cette question existe.

use 5.012;
use warnings;

my $name;

if( length $name ) { # no warning
    ...
    }

26voto

Adam Bellaire Points 42797

Comme mobrule l'indique, vous pouvez utiliser les éléments suivants à la place pour une petite épargne:

if (defined $name && $name ne '') {
    # do something with $name
}

Vous pourriez fossé de la définition de vérifier et d'obtenir quelque chose d'encore plus court, par ex.:

if ($name ne '') {
    # do something with $name
}

Mais dans le cas où l' $name n'est pas défini, alors que la logique de flux de travail comme prévu, si vous utilisez warnings (et vous devriez), alors vous allez avoir cet avertissement:

Utilisation de la valeur non initialisée dans la chaîne ne

Donc, si il ya une chance que $name peut ne pas être définie, vous avez vraiment besoin de vérifier pour definedness d'abord et avant tout, afin d'éviter que d'avertissement. Comme Sinan Ünür points, vous pouvez utiliser Scalaire::MoreUtils pour obtenir le code qui fait exactement cela (vérifie definedness, puis vérifie la longueur zéro) hors de la boîte, via l' empty() méthode:

use Scalar::MoreUtils qw(empty);
if(not empty($name)) {
    # do something with $name 
}

17voto

Sinan Ünür Points 76179

Tout d'abord, depuis length retourne toujours un nombre non négatif,

if ( length $name )

et

if ( length $name > 0 )

sont équivalentes.

Si vous êtes OK avec le remplacement d'une valeur indéfinie avec une chaîne vide, vous pouvez utiliser Perl 5.10 de l' //= - opérateur qui affecte le membre de droite à GAUCHE, à moins que le membre de GAUCHE est définie:

#!/usr/bin/perl

use feature qw( say );
use strict; use warnings;

my $name;

say 'nonempty' if length($name //= '');
say "'$name'";

Remarque l'absence de mises en garde sur une variable non initialisée comme $name est affectée à la chaîne vide si elle n'est pas définie.

Toutefois, si vous ne voulez pas dépendre de l'5.10 être installé, utilisez les fonctions fournies par Scalar::MoreUtils. Par exemple, le ci-dessus peut être écrite comme:

#!/usr/bin/perl

use strict; use warnings;

use Scalar::MoreUtils qw( define );

my $name;

print "nonempty\n" if length($name = define $name);
print "'$name'\n";

Si vous ne voulez pas pour les fringues $name, utilisez default.

5voto

Gaurav Points 1064

Dans le cas où je ne me soucie pas de savoir si la variable est - undef ou égal à '', j'ai l'habitude de le résumer ainsi:

$name = "" unless defined $name;
if($name ne '') {
  # do something with $name
}

1voto

mob Points 61524

On pourrait dire

 $name ne ""

au lieu de

 length $name > 0

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