工作代码:
if ( $check1 eq $search_key ...
以前的“错误”代码:
if ( $check1 =~ /$search_key/ ...
单词($check1
和$search_key
)应该是相同的,但为什么第二个单词不会一直返回true?这些有什么不同?
$check1
是通过拆分获得的。 $search_key
要么在(“word”)之前输入,要么在运行时输入:<>
),然后都传递给子程序。
另一个问题是,我可以在没有任何隐藏问题的情况下转换以下内容吗?
if ($category_id eq "subj") {
我希望能够说:=~ /subj/
以便“主题”仍然可以保持正确。
提前致谢。
答案 0 :(得分:12)
$check1 =~ /$search_key/
不起作用,因为$search_key
中的任何特殊字符都会被解释为正则表达式的一部分。
此外,这确实测试$check1
是否包含子串 $search_key
。你真的想要$check1 =~ /^$search_key$/
,虽然由于上面提到的原因它仍然是不正确的。
最好坚持使用eq
进行精确的字符串比较。
答案 1 :(得分:11)
如前所述,$ search_key中的特殊字符将被解释,为了防止这种情况,请使用\Q
:if ( $check1 =~ /\Q$search_key/)
,这将使$search_key
的内容为文字。例如,您可以使用\E
结束此if ( $check1 =~ /\b\Q$search_key\E\b/)
。
此信息位于perlre
答案 2 :(得分:1)
关于第二个问题,如果只想要普通子字符串匹配,可以使用index函数。然后替换
if ($category_id eq "subj") {
与
if (0 <= index $category_id, "subj") {
这是区分大小写的匹配。
添加以下内容:它将匹配asubj
,subj
,甚至subjugate