Почему такой матчинг регулярным выражением работает неверно?
$a=qq("jkj"kjkkj");
say "captures: \n\t".join(', '=>do { my $c=0; map $c++.': ('.$_.')', @l } )
if @l=$a=~m/^\s*(?<Q>['"])([^\g{Q}]+)\g{Q}\s*$/;
Выводит:
captures:
0: ("), 1: (jkj"kjkkj)
И это печально: непонятно, почему
[^\g{Q}]
Я пробовал вместо этого
[^(??{ $+{Q} })]
ЧЯДНТ?
Ответ:
В [] можно использовать только классы символов. Всё остальное будет принято «as is», внутри [] правила интерполяции отличаются от правил для остального регулярного выражения.
Если нужно делать «негативный матчинг» для паттерна известной длины, можно использовать конструкцию:
(?!\g{name}).{LENGTH}
LENGTH нужно подставить числом
Если длина паттерна равна 1 (символ), то просто
(?!\g{name}).
- что имеет смысл «символ, для которого предыдущий символ в предпросмотре не видел \g{name}» :)