А чтобы не создавалось ненужных
А чтобы не создавалось ненужных сохраненных состояний, можно это еще взять в атомарные скобки:
my $level1=qr/(?>(?>[^{}]+)|\{$level0})*/;
Программа
$_='a{b{c}d}e'; my $level0=qr/(?>[^{}]*)/; my $level1=qr/(?>(?>[^{}]+)|\{$level0})*/; s/\{$level1}//g; print $_;
уже справляется со скобками второго уровня вложенности, и на печать выводится
ae
Но если ей дать текст со скобками третьего уровня вложенности, то она оставляет скобки первого уровня вложенности:
$_='a{b{c{d}}e}f'; my $level0=qr/(?>[^{}]*)/; my $level1=qr/(?>(?>[^{}]+)|\{$level0})*/; s/\{$level1}//g; print $_;
Выводится
a{be}f
Мы могли бы по аналогии создать объект $level3 и т.д., но динамические регулярные выражения позволяют сразу создать объект $levelN для произвольного уровня вложенности:
#!/usr/bin/perl -w use strict;
$_=" {a{b{c{{d{}m}e}f}}gf{ }f"; my $levelN; $levelN=qr /(?> (?>[^{}]+)| # все кроме фигурных скобок \{(??{$levelN})} # или текст, соответств. всему шаблону, ограниченный скобками )* # сколько угодно раз /x; s/\{$levelN}//g; print $_;
В результате получаем
{agff
Это верный результат.
Как видим, объект $levelN строится рекурсивно, используя себя в качестве своего компонента. Поэтому переменную $levelN лучше объявить заранее, чтобы не было сообщения об использовании неинициализированной переменной.
В процессе работы регулярное выражение подставит $levelN столько раз, сколько раз встретит открывающую фигурную скобку.
Мы могли бы перенести внешние фигурные скобки внутрь нашего объекта $levelN, тогда в операторе подстановки не нужно было бы их выписывать:
$_=" {a{b{c{{d{}m}e}f}}gf{ }f"; my $levelN; $levelN=qr /\{ # открывающая фигурная скобка (?> (?>[^{}]+)| # все кроме фигурных скобок (??{$levelN}) # или текст, соответствующий всему шаблону )* # сколько угодно раз } # и закрывающая фигурная скобка /x; s/$levelN//g; print $_;
Во второй альтернативе также нужно убрать фигурные скобки, т.к. в $levelN они уже присутствуют. На печати результат тот же:
{agff
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий