$_ = q!0a { 1a { 1.1a } 1b { 1.2a } 1c { 1.3a 1.3b } } 0b { 2a { 2.1a} } 0c!; while(m!{[^{]+(({.*?})*)[^{]+}!g){ $inside = $1; print $&,"\n"; while($inside =~ m!{[^{]+(({.*?})*)[^{]+}!g){ print "\t",$&,"\n"; } } #### $_ = q!0a { 1a { 1.1a } 1b { 1.2a } 1c { 1.3a { 1.3.1a } 1.3b } } 0b { 2a { 2.1a} } 0c!;