#! perl -slw use strict; use Data::Dump qw[ pp ]; my $text = do{ local $/; ; }; my( $n, @scopes ) = 1; 1 while $text =~ s[ ( \{ [^{}]+ \} ) ]{ push @scopes, $1; '_' . $n++ . '_'; }gex; s[scope (\d+) text][processed text $1]g for @scopes; $text =~ s[_${ \( $_+1 ) }_]{ $scopes[ $_ ] }eg for reverse 0 .. $#scopes; print $text; __DATA__ text text {scope 4 text {scope 2 text {scope 1 text} scope 2 text} scope 4 text {scope 3 text} scope 4 text } text text #### C:\test>1139932 text text {processed text 4 {processed text 2 {processed text 1} processed text 2} processed text 4 {processed text 3} processed text 4 } text text