Я (полный новичок в 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
.
Как мне исправить это?
Во-первых, eq предназначен для сравнения строк; == предназначен для сравнения чисел.
Даже если условие "if" выполнено, оно не оценивает блок "then".
Я думаю, ваша проблема в том, что ваши переменные не содержат того, что вы думаете, что они делают. Я думаю, что ваш $str1
или $str2
содержит что-то вроде "taste\n" или так. Проверьте их, выполнив печать до , если: print "str1='$str1'\n";
.
Возвращаемая новая строка может быть удалена с помощью функции chomp($str1);
.
chomp
. Смотрите perldoc -f chomp
.
==
выполняет числовое сравнение: оно преобразует оба аргумента в число и затем сравнивает их. Пока $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.
"2foo" == "2bar"
, что было бы правдой. Ваш пример создания false неудивителен и на самом деле не иллюстрирует разницу между операторами, потому что эти строки не будут сравниваться как равные ни с одним оператором.
Вы пытались выполнить chomp $str1
и $str2
?
Я нашел аналогичную проблему с использованием (другой) $str1
eq 'Y', и она только ушла, когда я впервые сделал:
chomp($str1);
if ($str1 eq 'Y') {
....
}
работает после этого.
Надеюсь, что это поможет.
Возможно, неправильное условие:
$str1 == "taste" && $str2 == "waste"
Программа войдет в часть THEN
только в том случае, если оба указанных условия верны.
Вы можете попробовать с помощью $str1 == "taste" || $str2 == "waste"
. Это выполнит часть THEN
, если любое из вышеуказанных условий истинно.
$str1
и$str2
, мы не можем сказать вам, почему контроль достигает большего кода, который мы не видим. На ваш вопрос,eq
сравнивает скаляры лексикографически, так что здесь полезно, тогда как==
сравнивает численно, поэтому не будет ничего сравнивать со"taste"
.