web-dev-qa-db-fra.com

Quelle est la bonne façon de vérifier si une chaîne est vide dans Perl?

Je viens d'utiliser ce code pour vérifier si une chaîne est vide:

if ($str == "")
{
  // ...
}

Et aussi la même chose avec l'opérateur non égal ...

if ($str != "")
{
  // ...
}

Cela semble fonctionner (je pense), mais je ne suis pas sûr que ce soit la bonne façon, ou s'il y a des inconvénients imprévus. Quelque chose ne va pas.

85
Nick Bolton

Pour les comparaisons de chaînes en Perl, utilisez eq ou ne:

if ($str eq "")
{
  // ...
}

Le == et != Les opérateurs sont des opérateurs de comparaison numériques . Ils essaieront de convertir les deux opérandes en nombres entiers avant de les comparer.

Consultez la page de manuel perlop pour plus d'informations.

121
Greg Hewgill
  1. En raison de la manière dont les chaînes sont stockées dans Perl, l'obtention de la longueur d'une chaîne est optimisée.
    if (length $str) est un bon moyen de vérifier qu'une chaîne n'est pas vide.

  2. Si vous vous trouvez dans une situation où vous ne vous êtes pas déjà protégé contre undef, alors tout le monde qui cherche à "non vide" et qui ne vous prévient pas est if (defined $str and length $str).

87
hobbs

Comme déjà mentionné par plusieurs personnes, eq est le bon opérateur ici.

Si vous use warnings; dans votre script, vous recevrez des avertissements à ce sujet (et de nombreuses autres choses utiles); Je recommanderais use strict; ainsi que.

9
Matthew Slattery

Vous voudrez probablement utiliser "eq" au lieu de "==". Si vous vous inquiétez de certains cas Edge, vous pouvez également vouloir rechercher les éléments non définis:

if (not defined $str) {

# this variable is undefined

}
9
DmitryK

Le concept même d'une manière "correcte" de faire n'importe quoi, hormis l'utilisation de CPAN, n'existe pas en Perl.

Quoi qu'il en soit, ce sont des opérateurs numériques, vous devriez utiliser

if($foo eq "")

ou

if(length($foo) == 0)
4
whatsisname

Pour rechercher une chaîne vide, vous pouvez également effectuer les opérations suivantes.

if (!defined $val || $val eq '')
{
    # empty
}
0
Roland Ayala