Сравнение строк в Perl с "eq" vs "=="

Я (полный новичок в 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.

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

Ответ 1

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

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

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

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

Ответ 2

== выполняет числовое сравнение: оно преобразует оба аргумента в число и затем сравнивает их. Пока $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.

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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