$re = /begin (?: (?>[^be]*) |(??{ $re }) | [be] )* end/x; "begin begin end" =~ /$re/ and print "<$&>\n"; __END__