Есть ли функция Perl, чтобы превратить строку в регулярное выражение, чтобы использовать эту строку в качестве шаблона? - PullRequest
8 голосов
/ 15 октября 2008

У меня проблемы с использованием Perl grep () со строкой, в которой может содержать символы, которые интерпретируются как квантификаторы регулярных выражений.

Я получил следующую ошибку, когда шаблон grep "g ++", потому что символы '+' интерпретируются как квантификаторы. Вот вывод следующей программы:

1..3
ok 1 - grep, pattern not found
ok 2 - grep, pattern found

Nested quantifiers in regex; marked by <-- HERE
in m/g++ <-- HERE / at escape_regexp_quantifier.pl line 8.

Есть ли модификатор, который я мог бы использовать, чтобы указать grep, что квантификаторы должны игнорироваться, или есть функция, которая будет экранировать квантификаторы?

#! /usr/bin/perl 

sub test_grep($)
{
    my $filter = shift;
    my @output = ("-r-xr-xr-x   3 root     bin       122260 Jan 23  2005 gcc",
                  "-r-xr-xr-x   4 root     bin       124844 Jan 23  2005 g++");
    return grep (!/$filter/, @output);
}

use Test::Simple tests => 2;

ok(test_grep("foo"), "grep, pattern not found");
ok(test_grep("gcc"), "grep, pattern found");
ok(test_grep("g++"), "grep, pattern found");

PS: в дополнение к ответу на вопрос выше, я приветствую любые отзывы об использовании Perl выше, так как я все еще учусь. Спасибо

Ответы [ 5 ]

27 голосов
/ 15 октября 2008

Стандартным способом является использование escape-индикатора \Q перед вашей переменной, чтобы запретить Perl анализировать содержимое как регулярное выражение:

return grep (!/\Q$filter/, @output);

Изменение этой строки в вашем коде приводит к:

1..3
ok 1 - grep, pattern not found
ok 2 - grep, pattern found
ok 3 - grep, pattern found
15 голосов
/ 15 октября 2008

Я думаю, что вы ищете quotemeta

8 голосов
/ 15 октября 2008

в дополнение к ответу на вопрос выше, я приветствую любые отзывы об использовании Perl выше, так как я все еще учусь. Спасибо

Я бы посоветовал вам не использовать прототипы ( ($) после test_grep). Они имеют свое применение, но не в большинстве случаев, и определенно не в этом.

2 голосов
/ 15 октября 2008

В этом случае я бы предложил использовать qr для создания объектов Regexp, а не строк.

ok(test_grep(qr/foo/), "grep, pattern not found");
ok(test_grep(qr/gcc/), "grep, pattern found");
ok(test_grep(qr/g\+\+/), "grep, pattern found");

Тогда вам не нужен побег \ Q. Хотя вы все еще можете использовать его:

ok(test_grep(qr/\Qg++/), "grep, pattern found");
2 голосов
/ 15 октября 2008

PS: в дополнение к ответу на вопрос выше, я приветствую любые отзывы о Perl Использование в выше, как я до сих пор обучения.

Лучший совет, который я могу дать для общего кода по Perl, это установить Perl :: Critic и использовать команду perlcritic в вашем коде. Если вы не можете этого сделать, вы можете использовать онлайн-инструмент критики perl . Это поможет, если у вас есть копия Perl Best Practices , удобная, так как Perl::Critic уже прочитал книгу и даст вам ссылки на номера страниц, однако даже если у вас нет книги вокруг вас. все еще можно найти расширенные отзывы в документации Perl :: Critic , начиная с Perl::Critic::Policy::.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...