【问题标题】:Perl: Why would eq work, when =~ doesn't?Perl:当 =~ 不起作用时,为什么 eq 会起作用?
【发布时间】:2011-06-10 03:44:57
【问题描述】:

工作代码:

if ( $check1 eq $search_key ...

以前的“错误”代码:

if ( $check1 =~ /$search_key/ ...

这两个词($check1$search_key)应该是一样的,但是为什么第二个不是一直返回 true?这些有什么不同?

$check1 是通过拆分获得的。 $search_key 要么在(“word”)之前输入,要么在运行时输入:(<>),然后将两者都传递给子例程。

还有一个问题是,我可以在没有任何隐藏问题的情况下转换以下内容吗?

if ($category_id eq "subj") {

我希望能够说:=~ /subj/,这样“主题”仍然是真实的。

提前致谢。

【问题讨论】:

    标签: perl


    【解决方案1】:

    $check1 =~ /$search_key/ 不起作用,因为$search_key 中的任何特殊字符都将被解释为正则表达式的一部分。

    此外,这确实测试了$check1 是否包含子字符串 $search_key。你真的想要$check1 =~ /^$search_key$/,尽管由于上述原因它仍然不正确。

    最好坚持使用eq 进行精确的字符串比较。

    【讨论】:

    • 特殊字符会是什么,如果如前所述,它就是:“move”?
    • @Jon:好吧,如果你与一个明显不包含任何特殊正则表达式字符的常量进行比较,它会起作用。但是,当您与另一个变量进行比较时,您并不总是知道它包含哪些字符。
    • 即使$search_key 没有特殊的正则表达式字符,/^$search_key$/ 也将完全匹配$search_key 或带有尾随换行符的$search_key。当您真正的意思是“字符串结尾”时,请使用\z
    • @Jon,如果$check1 包含move 并且$search_key 包含move,那么$check1 =~ /$search_key/ 将返回true。 (当$check1 包含mover 时,它也会返回true,顺便说一句。)您的暗示并不意味着您不知道$check1$search_key 实际包含什么。
    • @ikegami:我相信这就是问题所在,为了达到这一点,我玩了很多,有分裂和 s///,所以它可能是一些看不见的东西。非常感谢大家解决这个问题。
    【解决方案2】:

    如前所述,$search_key 中的特殊字符将被解释,为防止这种情况,使用\Q:if ( $check1 =~ /\Q$search_key/),它将$search_key 的内容作为文字。例如,您可以使用\E 结束此if ( $check1 =~ /\b\Q$search_key\E\b/)

    此信息在perlre

    【讨论】:

    • 你也可以使用quotemeta:my $new_key = quotemeta( $search_key ); if( $check1 =~ /^$new_key$/ )。详情请见perldoc -f quotemeta
    • 好吧,归根结底,当简单的$check1 eq $search_key 就足够时,使用$check1 =~ /\b\Q$search_key\E\b/ 有什么意义?看起来像黑客?
    • @Blagovest Buyukliev 看起来像黑客有什么问题? ;--) 说真的,显然它与 eq 不是一回事,它是一个注定要启发读者的例子。归根结底,这就是我们在这里寻找的东西。
    • 好吧,作为一种教育体验它很棒,但作为一种应用实践却不是这样。
    【解决方案3】:

    关于你的第二个问题,如果你只是想要简单的子字符串匹配,你可以使用index 函数。然后替换

    if ($category_id eq "subj") {

    if (0 <= index $category_id, "subj") {

    这是区分大小写的匹配。

    添加说明:它将匹配asubjsubj,甚至subjugate

    【讨论】:

    • 感谢您告诉我,我以前从未听说过索引功能,所以它让我有一些阅读要做!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多