-1

我正在尝试匹配两个都充满元字符的东西,这些元字符需要在我的匹配模式中用作“文字”。 \Q假设引用字符串中的所有元字符,直到\E......但它不起作用。

那是怎么回事?

这是给我带来麻烦的行: if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {

4

2 回答 2

11

没有使用=~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;. 它可能在这里发现了一个问题(但不一定,取决于 的值$_)。

于 2012-02-28T16:56:50.890 回答
2

看起来您想将一个字符串 in$prev与一个 in进行比较$ww[0]。如果是这种情况,正则表达式匹配应如下所示:

$result = $prev !~ /\Q$ww[0]\E/

$result1如果$prev与 中的内容不同,则将返回www[0],忽略元字符。

但是,如果这就是您想要做的,您不妨使用ne

if ($prev ne $ww[0]){ 
   #do this if $prev and $ww[0] are not the same
} 

此外,正如@toolic 所提到的,将以下行添加到脚本的顶部:

use warnings;

这将为您提供有关脚本中可能存在的问题的一些反馈。

于 2012-02-28T16:51:33.470 回答