my $data = do {local $/; }; my $braces_re = qr/ \{ (?: (?> [^{}]+ ) | # Use either (?PARNO) or (??{ code }). #(?R) (??{ $braces_re }) )* \} /sx; $data =~ s{($braces_re)}{ my $len = length $1; "<$len> $1 " }eg; print $data; 1; __DATA__ { ... } { { } } { { { } } } { { } { { { } } } } { ... }