/sub\s+$name\s+{\s+(.*?(?=^}\s*$))/sm #### #!/usr/bin/perl -w seek(DATA,0,0); my $slurp; { local $/; $slurp = ; } print_sub($slurp,'bar'); print_sub($slurp,'foo'); sub print_sub { my ($content,$name) = @_; my ($body) = $content =~ /sub\s+$name\s+{\s+(.*?(?=^}\s*$))/sm; print $body; } sub foo { if (1) { return $_[0] + 5; } else { return 0; } # a comment } sub bar { print "howdy"; } __DATA__