#!/usr/local/bin/perl require 5.006; my $braces; $braces = qr/(\{(?:(?>[^\{\}]+)|(??{$braces}))*\})/; sub extract_braces { my($str, $level) = @_; while ($str =~ m!$braces!g) { my $inside = $1; print "\t" x $level, $inside, "\n"; $inside =~ s/\{(.*)\}/$1/; extract_braces($inside, $level + 1); } } my $str = '0a { 1a { 1.1a } 1b { 1.2a } 1c { 1.3a { 1.3.1a } 1.3b } } 0b { 2a { 2.1a} } 0c'; extract_braces($str, 0); __END__