2012-02-28 75 views
-1

我想匹配兩個東西,這兩個東西都是需要在我的匹配模式中用作'Literal'的元字符。 \Q是假設引用字符串中的所有元字符,直到\E ...但它不起作用。Perl,模式匹配和元字符

怎麼了?

這是給我麻煩線:if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {

+4

你不能比較這樣的兩個正則表達式。你能發佈更多的代碼,並澄清你想要做什麼? – MattLBeck 2012-02-28 16:39:29

+3

你是什麼意思「它不工作」?你想要插入「$ prev」還是「$ ww [0]」?或者不是嗎? – reinierpost 2012-02-28 16:40:40

+3

使用http:// perldoc。perl.org/warnings.html。 – toolic 2012-02-28 16:42:59

回答

2

它看起來像要在字符串中$prev$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; 

這會給你一些關於腳本可能出現的問題的反饋。

+0

非常感謝您的幫助!我像往常一樣複雜化了:)。 ($ prev ne $ ww [0])工作得很好。 – user1238319 2012-02-28 17:33:15

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;。它可能在這裏發現了問題(但不一定,取決於$_的值)。