Есть ли функция Perl, чтобы превратить строку в регулярное выражение, чтобы использовать эту строку в качестве шаблона?
У меня проблемы с использованием 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 ответов
Стандартный способ заключается в использовании \Q
перед вашей переменной экранируйте индикатор, чтобы запретить Perl анализировать содержимое как регулярное выражение:
return grep (!/\Q$filter/, @output);
Изменение этой строки в вашем коде приводит к:
1..3 ок 1 - grep, шаблон не найден хорошо 2 - grep, шаблон найден хорошо 3 - grep, шаблон найден
в дополнение к ответу на вопрос выше, я приветствую любые отзывы об использовании Perl в вышеприведенном виде, так как я все еще учусь. Спасибо
Я бы посоветовал вам не использовать прототипы (($) после test_grep). У них есть свои применения, но не в большинстве случаев и определенно не в этом.
PS: в дополнение к ответу на вопрос выше, я приветствую любые отзывы об использовании Perl выше, так как я все еще учусь.
Лучший совет, который я могу дать для общего кода по Perl, - это установить Perl:: Critic и использовать команду perlcritic в вашем коде. Если вы не можете этого сделать, вы можете использовать онлайн-инструмент Perl-критики. Это поможет, если у вас есть копия Perl Best Practices, так как Perl::Critic
уже прочитал книгу и даст вам ссылки на номера страниц, однако, даже если у вас нет книги, вы можете найти расширенный отзыв в разделах документации Perl:: Critic, начиная с Perl::Critic::Policy::
,
В этом случае я бы предложил использовать 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");