我正在尝试匹配两个都充满元字符的东西,这些元字符需要在我的匹配模式中用作“文字”。 \Q
假设引用字符串中的所有元字符,直到\E
......但它不起作用。
那是怎么回事?
这是给我带来麻烦的行: if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {
我正在尝试匹配两个都充满元字符的东西,这些元字符需要在我的匹配模式中用作“文字”。 \Q
假设引用字符串中的所有元字符,直到\E
......但它不起作用。
那是怎么回事?
这是给我带来麻烦的行: if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {
没有使用=~
or !~
,
/.../
简称
$_ =~ 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;
. 它可能在这里发现了一个问题(但不一定,取决于 的值$_
)。
看起来您想将一个字符串 in$prev
与一个 in进行比较$ww[0]
。如果是这种情况,正则表达式匹配应如下所示:
$result = $prev !~ /\Q$ww[0]\E/
$result
1
如果$prev
与 中的内容不同,则将返回www[0]
,忽略元字符。
但是,如果这就是您想要做的,您不妨使用ne
:
if ($prev ne $ww[0]){
#do this if $prev and $ww[0] are not the same
}
此外,正如@toolic 所提到的,将以下行添加到脚本的顶部:
use warnings;
这将为您提供有关脚本中可能存在的问题的一些反馈。