【问题标题】:String compare in Perl with "eq" vs "==" [duplicate]Perl中的字符串比较与“eq”与“==”[重复]
【发布时间】:2012-12-12 08:53:40
【问题描述】:

我是(一个完整的 Perl 新手)在 if 语句中进行字符串比较:

如果我执行以下操作:

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

我看到了正确的结果(即如果条件匹配,它会评估“then”块)。但我看到了这些警告:

在第 x 行的数字 eq (==) 中,参数“taste”不是数字。
参数“浪费”在第 x 行的数字 eq (==) 中不是数字。

但如果我这样做:

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

即使满足 if 条件,它也不会评估“then”块。

这里,$str1taste$str2waste

我应该如何解决这个问题?

【问题讨论】:

  • 请发布一个独立的示例。在不知道$str1$str2 是什么的情况下,我们无法告诉您为什么控制会到达更多我们看不到的代码。对于您的问题,eq 按字典顺序比较标量,因此在这里很有用,而 == 按数字比较,因此不会与 "taste" 进行有意义的比较。
  • @hari 发布初始化变量的确切代码。如果可能,请发布完整的函数或脚本。
  • 即使条件为假,如果“then”块被评估,这不是正确的结果。

标签: string perl


【解决方案1】:

首先,eq用于比较字符串; == 用于比较数字。

即使“if”条件得到满足,它也不会评估“then”块。

我认为您的问题是您的变量不包含您认为它们所做的事情。我认为您的$str1$str2 包含“taste\n”之类的内容。在您的 if 之前打印以检查它们:print "str1='$str1'\n";

可以使用chomp($str1); 函数删除尾随换行符。

【讨论】:

  • 在比较之前如何删除尾随换行符?
  • @hari 使用chomp。见perldoc -f chomp
  • 是的,$str1 最后有 "\n" 但使用 chomp 没有帮助。如果我这样做: if( $str1 eq "taste\n") 它可以工作。
  • 妈的,我也有回车。这就是我需要的: $str1 =~ s/\r|\n//g;多么菜鸟的错误。
  • @hari:这有点晚了,但如果你的字符串中有一个\r 字符,我想知道它是如何到达那里的。 Windows 使用'\r\n 来标记行尾,但如果您从文本文件以文本模式 读取,您只会得到'\n。也许您正在 Unix 或 Cygwin 系统上阅读 Windows 格式的文本文件?
【解决方案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.

【讨论】:

  • "2foo" == "3bar"; #False,字符串分别计算为 2 和 3
  • @Jean-FrancoisT。一个更有趣的例子是"2foo" == "2bar",这是真的。您的示例产生 false 并不令人惊讶,并没有真正说明运算符之间的区别,因为这些字符串不会与 any 运算符相等。
  • 这个例子背后的想法是用 "foo"=="bar" 绘制平行线,这是正确的,而 "2foo"=="3bar" 则不是
【解决方案3】:

您是否尝试过咀嚼$str1$str2

我在使用(另一个)$str1 eq 'Y' 时发现了一个类似的问题,并且在我第一次这样做时它才消失:

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

在那之后工作。

希望对您有所帮助。

【讨论】:

  • 这对我有帮助! :) 很高兴知道函数 chomp 不返回结果,而只是更改字符串本身。
【解决方案4】:

可能你使用的条件不正确:

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

只有当两个条件都为真时,程序才会进入THEN部分。

你可以试试$str1 == "taste" || $str2 == "waste"。如果上述任何一个条件为真,这将执行THEN 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2021-08-05
    相关资源
    最近更新 更多