2011-10-09 96 views
4

編寫一個程序,我從一個文件中讀取單詞/符號列表,並搜索另一個文本體中的每個單詞/符號。在perl中搜索圓括號

所以它是這樣的:

while(<FILE>){ 
    $findword = $_; 

    for (@text){ 
     if ($_=~ /$find/){ 
      push(@found, $_); 
     } 
    } 
} 

不過,我遇到了麻煩,一旦括號顯示。它給我這個錯誤:

Unmatched (in regex; marked by <-- HERE in m/(<-- HERE 

我意識到這是因爲Perl認爲(是正則表達式的一部分,但我要如何處理這個並使(搜索?

+0

如果你不想讓正則表達式元字符爲meta,那麼根本不要使用正則表達式。 @mu的第二部分太短,你的答案是正確的事情(它會快得多) – tadmc

回答

3

一般反斜槓字符內的正則表達式 - 即/\(/將匹配一個(

的情況下

這樣,最好使用引號操作符

if ($_ =~ /\Q$find\E/) { 
    ... 
} 

選擇使用quotemeta

2

你」我想要做/\Q$find\E/而不是僅僅是/$find/ - \Q告訴解析器停止考慮metacharac作爲正則表達式的一部分,直到找到\E

1

我懷疑你會發現m/\Q$find\E/有用 - 除非你想要其他的Perl正則表達式元字符被解釋爲元字符。

4

你可以使用\Q and \E

if ($_ =~ /\Q$find\E/){ 

或者只是使用index如果你只是尋找一個字面匹配:

if(index($_, $find) >= 0) { 
+1

是的,索引是如果你只是尋找一個常量字符串的方式。 – Alex

0

\Q\e將逃不出你的特殊字符在$find變量如:

while(<FILE>){ 
    $findword = $_; 

    for (@text){ 
     if ($_=~ /\Q$find\e/){ 
      push(@found, $_); 
     } 
    } 
}