2011-10-09 97 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, $_); 
     } 
    } 
}