web-dev-qa-db-fra.com

Comparaison de chaînes en Perl avec "eq" vs "=="

Je suis (un débutant complet en Perl) en train de comparer des chaînes dans une instruction if:

Si je fais ce qui suit:

if ($str1 == "taste" && $str2 == "waste") { }

Je vois le résultat correct (c'est-à-dire que si la condition correspond, le bloc "then" est évalué). Mais je vois ces avertissements:

L'argument "taste" n'est pas numérique dans l'eq numérique (==) au numéro de ligne x.
L'argument "gaspillage" n'est pas numérique dans l'eq numérique (==) à la ligne numéro x.

Mais si je le fais:

if ($str1 eq "taste" && $str2 eq "waste") { }

Même si la condition if est remplie, le bloc "then" n'est pas évalué.

Ici, $str1 est taste et $str2 est waste.

Comment dois-je résoudre ce problème?

78
hari

Tout d'abord, eq sert à comparer des chaînes; == sert à comparer des nombres.

Même si la condition "si" est remplie, le bloc "alors" n'est pas évalué.

Je pense que votre problème est que vos variables ne contiennent pas ce que vous pensez qu'elles font. Je pense que votre $str1 ou $str2 contient quelque chose comme "goût\n" ou presque. Vérifiez-les en les imprimant avant votre if: print "str1='$str1'\n";.

Le retour à la ligne final peut être supprimé avec la fonction chomp($str1);.

104
PSIAlt

== effectue une comparaison numérique: il convertit les deux arguments en un nombre, puis les compare. Tant que $str1 et $str2 sont tous deux égaux à 0, la condition est remplie.

eq effectue une comparaison de chaînes: les deux arguments doivent correspondre lexicalement (sensible à la casse) pour que la condition soit satisfaite.

"foo" == "bar";   # True, both strings evaluate to 0.
"foo" eq "bar";   # False, the strings are not equivalent.
"Foo" eq "foo";   # False, the F characters are different cases.
"foo" eq "foo";   # True, both strings match exactly.
28
cdhowie

Avez-vous essayé de modifier le $str1 et $str2?

J'ai trouvé un problème similaire en utilisant (un autre) $str1 eq 'Y' et il n'est parti que lorsque je l'ai fait pour la première fois:

chomp($str1);
if ($str1 eq 'Y') {
....
}

fonctionne après cela.

J'espère que ça t'as aidé.

5
user4185253