поиск скобок в Perl - PullRequest
       3

поиск скобок в Perl

4 голосов
/ 09 октября 2011

Написание программы, в которой я читаю список слов / символов из одного файла и ищу каждое из них в другом тексте.

Так что это что-то вроде:

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

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

Тем не менее, я сталкиваюсь с проблемой, когда появляются скобки.Это дает мне такую ​​ошибку:

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

Я понимаю, что это потому, что Perl считает ( частью регулярного выражения, но как мне с этим справиться и сделать поиск ( доступным?

Ответы [ 5 ]

4 голосов
/ 09 октября 2011

Вы можете использовать \Q и \E:

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

Или просто использовать index, если вы просто ищете литералсовпадение:

if(index($_, $find) >= 0) {
3 голосов
/ 09 октября 2011

Обычно обратная косая черта экранирует символы внутри регулярных выражений - то есть /\(/ будет соответствовать литералу (

в подобных ситуациях лучше использовать оператор кавычек

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

альтернативно используйте quotemeta

2 голосов
/ 09 октября 2011

Вы захотите сделать /\Q$find\E/ вместо /$find/ - \Q говорит парсеру прекратить рассматривать метасимволы как часть регулярного выражения, пока не найдет \E.

1 голос
/ 09 октября 2011

Я подозреваю, что вы найдете m/\Q$find\E/ полезным - если вы не хотите, чтобы другие метасимволы регулярных выражений Perl интерпретировались как метасимволы.

0 голосов
/ 09 октября 2011

\Q с \e спасет ваши специальные символы в переменной $find, например:

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

    for (@text){
        if ($_=~ /\Q$find\e/){
            push(@found, $_);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...