【问题标题】:What's the difference between 'eq' and '=~' in Perl?Perl 中的 'eq' 和 '=~' 有什么区别?
【发布时间】:2009-09-17 12:40:10
【问题描述】:

这两个运算符有什么区别?具体来说,$a 的哪些差异会导致两者的行为不同?

$a =~ /^pattern$/

$a eq 'pattern'

【问题讨论】:

    标签: perl operators


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    另一方面,如果您需要做一些 other 的事情,那么正则表达式形式比纯字符串相等性测试要灵活得多。有关正则表达式的更多信息,请参阅perldoc perlre。

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

    【讨论】:

      【解决方案3】:

      eq -- 测试字符串是否相等。

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

      有关所有运算符的更深入描述,请参阅here。

      【讨论】:

        【解决方案4】:

        “模式\n”:)

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

        也许你的意思是 /^pattern\z/。

        【讨论】:

        • Jepp,对 - 这是解决方案 - 这只是我工作场所的一个小问题 - 我不是后端编码器,但我很好奇 - 空格接受是不同的 :)
        • @chronotype:一般不是空格;特别是单个换行符(“pattern\n\n”或“pattern\t”不匹配)。 $(不带 /m)匹配字符串的结尾或字符串末尾的换行符之前。
        【解决方案5】:

        =~ 是绑定运算符。它用于将值绑定到模式匹配 (m//)、替换 (s///) 或音译(tr// 或 y//)。

        eq 是字符串相等运算符;它比较两个值以确定它们在被视为字符串时是否相等。有一个对等的== 运算符仅将值视为数字来执行相同的操作。 (在 Perl 中,字符串和数字大多可以互换,转换会根据值的使用方式自动发生。因此,当您想要比较两个值时,您必须指定要执行的比较类型。)

        一般来说,$var =~ m/.../ 确定$var 的值是否匹配模式,而不是它是否等于特定值。但是,在这种情况下,模式被锚定在两端并且只包含文字字符,因此它相当于字符串比较。这里最好使用eq,因为它更清晰,更快捷。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-07
          • 2020-10-15
          • 1970-01-01
          • 2010-10-07
          • 2015-09-02
          • 2010-12-23
          • 1970-01-01
          相关资源
          最近更新 更多