Perl中'eq'和'=〜'之间有什么区别?

时间:2009-09-17 12:40:10

标签: perl operators

这两个运营商有什么区别?具体来说,$a的差异会导致两者之间的不同行为吗?

$a =~ /^pattern$/

$a eq 'pattern'

5 个答案:

答案 0 :(得分:28)

eq用于测试字符串相等性,==与数字相等是相同的。

=~运算符用于将正则表达式应用于标量。

有关每个Perl运算符的详细信息以及它们的用途,请参阅perldoc perlop联机帮助页。

答案 1 :(得分:18)

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

如果你真的只想知道两个字符串是否相同,后者是首选的原因:

  • 可读性 - 它更简洁,包含更少的特殊字符。
  • 可维护性 - 使用正则表达式模式,您必须转义字符串中可能出现的任何特殊字符,或使用额外的标记,例如\Q\E。使用单引号字符串,您需要转义的唯一字符是单引号。 (你还必须转义反斜杠,如果后面跟着另一个反斜杠或字符串分隔符。)
  • 性能 - 为了比较字符串,您不会产生启动正则表达式引擎的开销。例如,如果您的计划中发生了数百万次,那么效益就会显着。

另一方面,如果你需要做一些 other 而不是普通的字符串相等测试,那么正则表达式会更灵活。有关正则表达式的更多信息,请参阅perldoc perlre

编辑:ysth之前的大多数人一样,我错过了他们之间明显的功能性差异,并直接寻求更抽象的差异。我已经澄清了这个问题,但我会把答案留作(希望)有用的参考。

答案 2 :(得分:6)

eq - 测试字符串相等。

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

有关所有运营商的更深入描述,请参阅here

答案 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,因为它更清晰,更快。