Сравнение строк в Perl с «eq» против «==»

63

Я (полный новичок в Perl), выполняющий сравнение строк в инструкции if:

Если я делаю следующее:

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

Я вижу правильный результат (т.е. если условие соответствует, оно вычисляет блок "then" ). Но я вижу эти предупреждения:

Аргумент "вкус" не является числовым в числовом eq (==) при номере строки x.
Аргумент" Отходы" не является числовым в числовом eq (==) при номере строки x.

Но если я это сделаю:

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

Даже если условие if выполнено, оно не оценивает блок "then".

Здесь $str1 есть taste, а $str2 - waste.

Как мне исправить это?

  • 5
    Пожалуйста, опубликуйте отдельный пример. Не зная, что такое $str1 и $str2 , мы не можем сказать вам, почему контроль достигает большего кода, который мы не видим. На ваш вопрос, eq сравнивает скаляры лексикографически, так что здесь полезно, тогда как == сравнивает численно, поэтому не будет ничего сравнивать со "taste" .
  • 1
    Обновил очередь.
Показать ещё 2 комментария
Теги:
string

4 ответа

90
Лучший ответ

Во-первых, eq предназначен для сравнения строк; == предназначен для сравнения чисел.

Даже если условие "if" выполнено, оно не оценивает блок "then".

Я думаю, ваша проблема в том, что ваши переменные не содержат того, что вы думаете, что они делают. Я думаю, что ваш $str1 или $str2 содержит что-то вроде "taste\n" или так. Проверьте их, выполнив печать до , если: print "str1='$str1'\n";.

Возвращаемая новая строка может быть удалена с помощью функции chomp($str1);.

  • 0
    Как удалить завершающий символ новой строки, если он присутствует, перед сравнением?
  • 0
    @hari используйте chomp . Смотрите perldoc -f chomp .
Показать ещё 3 комментария
26

== выполняет числовое сравнение: оно преобразует оба аргумента в число и затем сравнивает их. Пока $str1 и $str2 оценивают как 0 как числа, условие будет выполнено.

eq выполняет сравнение строк: два аргумента должны соответствовать лексически (с учетом регистра) для условия, которое должно быть выполнено.

"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.
  • 7
    "2foo" == "3bar"; #False, строки оцениваются соответственно в 2 и 3
  • 8
    @ Жан-Francoist. Более интересный пример был бы "2foo" == "2bar" , что было бы правдой. Ваш пример создания false неудивителен и на самом деле не иллюстрирует разницу между операторами, потому что эти строки не будут сравниваться как равные ни с одним оператором.
Показать ещё 1 комментарий
5

Вы пытались выполнить chomp $str1 и $str2?

Я нашел аналогичную проблему с использованием (другой) $str1 eq 'Y', и она только ушла, когда я впервые сделал:

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

работает после этого.

Надеюсь, что это поможет.

  • 0
    Это помогло мне! :) Хорошо знать, что функция chomp не возвращает результат, а просто меняет саму строку.
-4

Возможно, неправильное условие:

$str1 == "taste" && $str2 == "waste"

Программа войдет в часть THEN только в том случае, если оба указанных условия верны.

Вы можете попробовать с помощью $str1 == "taste" || $str2 == "waste". Это выполнит часть THEN, если любое из вышеуказанных условий истинно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню