use strict; use warnings; my $re = qr/ \{ # Opening bracket ((?: # Capture the contents [^}{]+ | (??{$re}) # Or recurse )+) # and allow repeats internally \} # Closing bracket /x; my $str = do { local $/; }; while ($str =~ /sub\s+(.*?)\s*?$re/gsi) { print "Subroutine [$1]\n", "=================\n", "{$2}\n\n"; } __DATA__ sub max { my ($a, $b) = @_; return $a > $b ? $a : $b; } sub min { my ($a, $b) = @_; return $a < $b ? $a : $b; }