sub find_ends { local $_ = $_[0]; my @ends; while (/(sub\s+\S+\s*{[^}]*})/g) { my $sub = $1; my $end; while ($sub) { my $open = $sub =~ tr/{/{/; my $close = $sub =~ tr/}/}/; if ($open > $close and /\G([^}]*})/g) { $sub .= $1; $end = $+[0]; } else { $end = $+[0]; last; } } push @ends, $end; } return @ends; }