80 votes

perl chaîne de comparer avec "eq" vs "=="

Je suis (une perl débutant) faire de comparaison de chaîne dans une instruction if:

Si je ne les suivants:

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

Je vois le résultat correct (c'est à dire si la condition est satisfaite, il évalue le "puis" bloquer). Mais je vois cet avertissement:

Argument "taste" isn't numeric in numeric eq (==) at line number x.
Argument "waste" isn't numeric in numeric eq (==) at line number x.

Mais si je fais:

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

Même si la si la condition est satisfaite, il n'a pas d'évaluer la "puis" bloquer.

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

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

106voto

PSIAlt Points 4013

Tout d'abord, l'égaliseur est pour la comparaison de chaînes; == est pour comparer des nombres.

Même si le "si" condition est satisfaite, il n'a pas d'évaluer la "puis" bloquer.

Je pense que votre problème est que les variables ne contiennent pas de ce que vous pensez qu'ils font. Je pense que votre $str1 ou $str2 contient quelque chose comme "goût\n". Vérifier par impression avant de votre si: print "str1='$str1'\n";.

La fuite de saut de ligne peut être retiré à l' chomp($str1); fonction.

28voto

cdhowie Points 62253

== t une comparaison numérique: il convertit les deux arguments d'un nombre, puis les compare. Tant que $str1 et $str2 à la fois d'évaluer à 0 comme le nombre, la condition est satisfaite.

eq t une comparaison de chaînes de caractères: 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.

5voto

user4185253 Points 11

Avez-vous essayé de chomp l' $str1 et $str2?

J'ai trouvé un problème similaire avec l'aide de (autre) $str1 eq 'Y' et il ne s'en alla quand j'ai fait:

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

fonctionne après.

Espérons que cela aide.

-5voto

user1931990 Points 1

Peut-être la condition que vous utilisez est incorrect :

$str1 == "taste" && $str2 == "waste"
le programme entrera en THEN part que lorsque les deux conditions sont vraies.

Vous pouvez essayer avec des $str1 == "taste" || $str2 == "waste" , ceci exécutera THEN part si quelqu'un de la condition ci-dessus est vrai.

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