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

95

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 not equals ...

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 tout simplement pas.

Nick Bolton
la source

Réponses:

134

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

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

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

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

Greg Hewgill
la source
Oui, en utilisant ceci, vous devez faire attention que si c'est undef, et si vous utilisez des avertissements, vous obtiendrez un avertissement d'exécution. De nombreuses façons de contourner l'avertissement cependant.
Evan Carroll
90
  1. En raison de la façon dont les chaînes sont stockées en 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 êtes dans une situation où vous ne vous êtes pas déjà prévenu undef, alors le fourre-tout pour "non-vide" qui ne vous avertira pas est if (defined $str and length $str).

Hobbs
la source
6
Je pense que cette longueur est le test le plus proche que nous ayons de l'expression de l'idée qu'il n'y a rien dans la chaîne.
brian d foy
6
Voté parce que if (length($str))c'est une bonne approche et n'échoue pas si la variable n'est pas définie.
base6
10

Vous voudrez probablement utiliser "eq" au lieu de "==". Si vous vous inquiétez de certains cas extrêmes, vous pouvez également vérifier si non défini:

if (not defined $str) {

# this variable is undefined

}
DmitryK
la source
1
Très utile lorsque vous avez obtenu la chaîne en décalant un tableau qui peut avoir 0 élément.
Dacav
9

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

Si vous êtes use warnings;dans votre script, vous recevrez des avertissements à ce sujet (et bien d'autres choses utiles); Je recommanderais use strict;aussi.

Matthew Slattery
la source
+1 Cool, ouais j'utilise normalement use strictmais je mets à jour un ancien code, donc quand j'ajoute cela, j'obtiens des centaines d'erreurs. Je vais probablement les réparer un jour.
Nick Bolton
4

Le concept même d'une manière «correcte» de faire quoi que ce soit, à part l'utilisation de CPAN, est inexistant 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)
comment s'appelle-t-il
la source
3
Il est vrai que Perl n'a pas tendance à préconiser la "seule vraie voie" pour résoudre les problèmes, mais cela ne signifie pas qu'il n'y a pas d'idiomes, de styles et d'approches fortement préférés. De plus, comme l'un des habitués de Perl aime beaucoup le dire, même s'il y a plus d'une façon de faire les choses, certaines façons de faire les choses sont vraiment, vraiment mauvaises (stupides, mal avisées, difficiles à entretenir, etc. .)
Télémaque
2
Ce n'est pas parce qu'il existe de nombreuses façons de le faire que toutes les manières sont égales. Test des chaînes vides à l' aide if ($foo == ""), par exemple, est définitivement faux , sauf si vous avez réellement moyen à tester pour savoir si $foo, évalué dans le contexte numérique, a une valeur de 0 (auquel cas il serait encore mieux écrit if ($foo == 0), car cela exprime plus clairement votre intention).
Dave Sherohman
0

Pour rechercher une chaîne vide, vous pouvez également faire quelque chose comme suit

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