web-dev-qa-db-ja.com

Perlで "eq"と "=="で文字列を比較する

私は(完全なPerl初心者)ifステートメントで文字列比較をしています。

私が次のようにすれば:

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

正しい結果が表示されます(つまり、条件が一致すると、「then」ブロックが評価されます)。しかし、私はこれらの警告を見ます:

引数 "taste"は、行番号xの数値式(==)では数値ではありません。
引数 "waste"は、行番号xの数値eq(==)では数値ではありません。

しかし私がするならば:

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

If条件が満たされても、「then」ブロックは評価されません。

ここで、$str1taste$str2wasteです。

これをどのように修正すればよいですか。

76
hari

まず、eqは文字列を比較するためのものです。 ==は数字を比較するためのものです。

「if」条件が満たされても、「then」ブロックは評価されません。

あなたの問題はあなたの変数があなたが彼らが思うと思うものを含まないことであると思います。あなたの$str1$str2には "taste\n"のようなものが含まれていると思います。 ifprint "str1='$str1'\n";の前に印刷して確認してください。

末尾の改行はchomp($str1);関数で削除できます。

102
PSIAlt

==は数値比較を行います:両方の引数を数値に変換してからそれらを比較します。 $str1$str2が両方とも数値として0に評価される限り、条件は満たされます。

eqは文字列比較を行います。条件が満たされるには、2つの引数が字句的に一致する必要があります(大文字と小文字が区別されます)。

"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

$str1$str2をchompしようとしましたか?

私は(別の)$str1 eq 'Y'を使用することで同様の問題を見つけました、そしてそれは私が最初にしたときに消えました:

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

その後動作します。

それが役立つことを願っています。

5
user4185253