这两个运营商有什么区别?具体来说,$a
的差异会导致两者之间的不同行为吗?
$a =~ /^pattern$/
$a eq 'pattern'
答案 0 :(得分:28)
答案 1 :(得分:18)
正如其他人所说,($a =~ /^pattern$/)
使用正则表达式引擎来评估字符串是否相同,而($a eq 'pattern')
是纯字符串相等性测试。
如果你真的只想知道两个字符串是否相同,后者是首选的原因:
\Q
和\E
。使用单引号字符串,您需要转义的唯一字符是单引号。 (你还必须转义反斜杠,如果后面跟着另一个反斜杠或字符串分隔符。)另一方面,如果你需要做一些 other 而不是普通的字符串相等测试,那么正则表达式会更灵活。有关正则表达式的更多信息,请参阅perldoc perlre。
编辑:与ysth之前的大多数人一样,我错过了他们之间明显的功能性差异,并直接寻求更抽象的差异。我已经澄清了这个问题,但我会把答案留作(希望)有用的参考。
答案 2 :(得分:6)
答案 3 :(得分:3)
“pattern \ n”:)
$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';
也许你的意思是/ ^ pattern \ z /.
答案 4 :(得分:2)
=~
是绑定运算符。它用于将值绑定到模式匹配(m//
),替换(s///
)或音译(tr//
或y//
)。
eq
是字符串相等运算符;它比较两个值,以确定它们在被视为字符串时是否相等。有一个对等==
运算符只执行相同的操作,只将值视为数字。 (在Perl中,字符串和数字大多可以自动发生转换,具体取决于值的使用方式。因此,当您想比较两个值时,必须指定要执行的比较类型。)
通常,$var =~ m/.../
确定$var
的值是否与模式匹配,而不是它是否等于特定值。但是,在这种情况下,模式锚定在两端,只包含文字字符,因此它等同于字符串比较。最好在这里使用eq
,因为它更清晰,更快。