А чтобы не создавалось ненужных
А чтобы не создавалось ненужных сохраненных состояний, можно это еще взять в атомарные скобки:
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
Это верный результат.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий