#!/usr/bin/perl $tempstr = qq` [IF a = /1/ 1 ELSIF b = /2/ 2 ELSE 3 ] `; my $reg = qr{\[(?:(?>[^\[\]]+)|(??{$reg}))*\]}; $tempstr =~ s/\[(?:IF|ELSIF|ELSE)(\s+\S+\s*\=\s*.*?)?\n((?:$reg|\n|[^\[\]])+\])/iffer($1,$2)/ges; sub iffer { my $test = shift; $test .= shift; print "trying iffer... test: $test\n"; my $reg = qr{\[(?:(?>[^\[\]]+)|(??{$reg}))*\]}; $test =~ s/(?:(?:$reg|\n|[^\[\]])+?)(^(?:ELSIF|ELSE\s*\n).*\]|\])/\[$1/sm; return $test; } #### $ ./t.pl trying iffer... test: a = /1/1 ELSIF b = /2/ 2 ELSE 3 ] $ #### #!/usr/bin/perl $tempstr = qq` [IF a = /1/ 1 ELSIF b = /2/ 2 ELSE 3 ] `; my $reg = qr{\[(?:(?>[^\[\]]+)|(??{$reg}))*\]}; while ($tempstr =~ s/\[(?:IF|ELSIF|ELSE)(\s+\S+\s*\=\s*.*?)?\n((?:$reg|\n|[^\[\]])+\])/iffer($1,$2)/ges) {} sub iffer { my $test = shift; $test .= shift; print "trying iffer... test: $test\n"; my $reg = qr{\[(?:(?>[^\[\]]+)|(??{$reg}))*\]}; $test =~ s/(?:(?:$reg|\n|[^\[\]])+?)(^(?:ELSIF|ELSE\s*\n).*\]|\])/\[$1/sm; return $test; } #### $ ./t.pl trying iffer... test: a = /1/1 ELSIF b = /2/ 2 ELSE 3 ] trying iffer... test: b = /2/2 ELSE 3 ] trying iffer... test: 3 ] $