这两个运算符有什么区别?具体来说,$a 有什么不同的值会导致它们之间有不同的行为?
$a =~ /^pattern$/
$a eq 'pattern'
正如其他人所指出的那样,($a =~ /^pattern$/)
使用正则表达式引擎来评估字符串是否相同,而($a eq 'pattern')
则是普通的字符串等同测试。
如果你真的只想知道两个字符串是否相同,后者更受推荐,原因如下:
\Q
和\E
。对于单引号字符串,您仅需要转义一个单引号。(如果反斜线后面跟着另一个反斜线或字符串分隔符,您还必须转义反斜线.)另一方面,如果你需要做一些非简单字符串等同测试之外的事情,正则表达式形式要灵活得多。请参阅perldoc perlre以了解有关正则表达式的更多信息。
编辑:和ysth以及其他大多数人一样,我没有注意到它们之间的明显功能差异,而是直接考虑了更抽象的差异。我已经澄清了问题,但我会将答案保留作为(希望)有用的参考。
=~
是绑定操作符。它用于将一个值绑定到模式匹配(m//
)、替换(s///
)或转译(tr//
或y//
)中。
eq
是字符串相等运算符;当作为字符串比较两个值是否相等时,它们会进行比较。有一个同级的运算符==
,只考虑将值作为数字进行比较。(在Perl中,字符串和数字大多数情况下是可以互换的,具体取决于如何使用这些值进行自动转换。因此,在比较两个值时,必须指定要执行的比较类型。)
通常情况下,$var =~ m/.../
确定变量 $var
的值是否与模式匹配,而不是是否等于特定值。然而,在这种情况下,模式在两端都有锚定,并且只包含文字字符,所以它相当于一个字符串比较。更好的做法是在这里使用eq
,因为它更清晰、更快速。
"pattern\n" :)
$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';
perldoc perlop
,您还可以在 Github 上查看正在进行中的perlopref
:http://github.com/cowens/perlopref。 - Telemachus