在Perl中,“eq”和“=〜”有什么区别?

19

这两个运算符有什么区别?具体来说,$a 有什么不同的值会导致它们之间有不同的行为?

$a =~ /^pattern$/

$a eq 'pattern'
5个回答

36

eq用于测试字符串相等性,==则用于数字相等性。

=~操作符是将正则表达式应用于标量的。

有关每个Perl运算符及其用途的详细信息,请参阅perldoc perlop手册。


2
除了 perldoc perlop,您还可以在 Github 上查看正在进行中的 perlopref:http://github.com/cowens/perlopref。 - Telemachus

19

正如其他人所指出的那样,($a =~ /^pattern$/)使用正则表达式引擎来评估字符串是否相同,而($a eq 'pattern')则是普通的字符串等同测试。

如果你真的只想知道两个字符串是否相同,后者更受推荐,原因如下:

  • 可读性 - 它更加简洁,包含较少的特殊字符。
  • 可维护性 - 对于一个正则表达式模式,您必须转义可能出现在字符串中的任何特殊字符,或使用额外标记例如\Q\E。对于单引号字符串,您仅需要转义一个单引号。(如果反斜线后面跟着另一个反斜线或字符串分隔符,您还必须转义反斜线.)
  • 性能 - 你不需要启动正则表达式引擎来比较一个字符串,因此避免了额外的开销。如果在程序中这种情况发生了数百万次,那么收益是可见的。

另一方面,如果你需要做一些简单字符串等同测试之外的事情,正则表达式形式要灵活得多。请参阅perldoc perlre以了解有关正则表达式的更多信息。

编辑:ysth以及其他大多数人一样,我没有注意到它们之间的明显功能差异,而是直接考虑了更抽象的差异。我已经澄清了问题,但我会将答案保留作为(希望)有用的参考。


6

eq -- 测试字符串相等性。

=~ -- 将标量表达式绑定到模式匹配。

更多运算符的详细描述,请参见此处


4

=~ 是绑定操作符。它用于将一个值绑定到模式匹配(m//)、替换(s///)或转译(tr//y//)中。

eq 是字符串相等运算符;当作为字符串比较两个值是否相等时,它们会进行比较。有一个同级的运算符==,只考虑将值作为数字进行比较。(在Perl中,字符串和数字大多数情况下是可以互换的,具体取决于如何使用这些值进行自动转换。因此,在比较两个值时,必须指定要执行的比较类型。)

通常情况下,$var =~ m/.../ 确定变量 $var 的值是否与模式匹配,而不是是否等于特定值。然而,在这种情况下,模式在两端都有锚定,并且只包含文字字符,所以它相当于一个字符串比较。更好的做法是在这里使用eq,因为它更清晰、更快速。


4

"pattern\n" :)

$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';

也许你想要的是 /^pattern\z/。

没错,这就是解决方案-这只是我工作场所的一个小问题-我不是后端编码人员,但我很好奇-空格接受是区别之处 :) - user150283
@chronotype:不是一般的空格;具体来说,是单个换行符(“pattern\n\n”或“pattern\t”不匹配)。$(没有/m)匹配字符串的结尾或者仅在字符串末尾的换行符之前。 - ysth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接