我正在尝试匹配两个都满足元字符的东西,这些元字符需要在我的匹配模式中用作“文字”。 \Q
假设在\E
之前引用字符串中的所有元字符...但它不起作用。
那是什么?
这是给我带来麻烦的一行:if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {
答案 0 :(得分:11)
不使用=~
或!~
,
/.../
是
的缩写$_ =~ m/.../
所以
/\Q$prev\E/ !~ /\Q$ww[0]\E/
是
的缩写($_ =~ /\Q$prev\E/) !~ /\Q$ww[0]\E/
取决于左正则表达式匹配是否成功,相当于以下之一:
"" !~ /\Q$ww[0]\E/
"1" !~ /\Q$ww[0]\E/
你只想:
$prev !~ /\Q$ww[0]\E/ # $ww[0] doesn't contains $prev
如果你真的想要
$prev !~ /^\Q$ww[0]\E\z/ # $ww[0] isn't equal to $prev
然后你可以将其简化为
$prev ne $ww[0] # $ww[0] isn't equal to $prev
顺便说一句,请始终使用use strict; use warnings;
。它可能在这里发现了一个问题(但不一定,取决于$_
的值)。
答案 1 :(得分:2)
您希望将$prev
中的字符串与$ww[0]
中的字符串进行比较。如果是这种情况,正则表达式匹配应如下所示:
$result = $prev !~ /\Q$ww[0]\E/
如果$result
与1
中的内容不同,则{p> $prev
将返回www[0]
,忽略元字符。
但是,如果这就是您想要做的,那么您也可以使用ne
:
if ($prev ne $ww[0]){
#do this if $prev and $ww[0] are not the same
}
另外,正如@toolic所提到的,将以下行添加到脚本的顶部:
use warnings;
这将为您提供有关脚本中可能出现的问题的一些反馈。