Соответствие регулярному выражению с "(" в perl - PullRequest
0 голосов
/ 19 ноября 2018

Я попробовал следующий код

my $line = "(int)";
my $pattern = qr(^\(int\));

if ( $line =~ /$pattern/ ) {
    print "line matched";
} else {
    print "line not matched";
}

Это не соответствует.

Можете ли вы помочь с шаблоном, который соответствует этой строке

Спасибо.

1 Ответ

0 голосов
/ 19 ноября 2018

Я полагаю, что в более ранних версиях perl могла быть такая ошибка: если вы используете \ для экранирования метасимвола регулярных выражений, который также является разделителем конструкций в кавычках, он рассматривается как метасимвол, а не как буквальный символ.Попробуйте использовать другой разделитель для своего регулярного выражения, например qr/^\(int\)/.


$ for v in 10 12 14 16 18 20 22 24 26 ; do
   echo "5.$v"
   "5.${v}t"/bin/perl -le'print qr(^\(int\))'
   echo
done
5.10
(?-xism:^(int))

5.12
(?-xism:^(int))

5.14
(?^:^(int))

5.16
(?^:^(int))

5.18
Useless use of '\'; doesn't escape metacharacter '(' at -e line 1.
(?^:^(int))

5.20
Useless use of '\'; doesn't escape metacharacter '(' at -e line 1.
(?^:^(int))

5.22
(?^:^\(int\))

5.24
(?^:^\(int\))

5.26
(?^:^\(int\))

. Поэтому в 5.18 добавлено предупреждение при использовании экранированного разделителя (даже если предупреждения отключены), а в 5.22 изменилось поведение..

(Почти как цикл устаревания, за исключением того, что предупреждение предупредило, что вы, возможно, не ожидали старого поведения, а не ожидаемого нового поведения, которое кажется неудачным.)

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