use warnings; use strict; while(){ chomp; print $1,$/ if/^sub\s+?(.+?){/; ## print subroutine name if(/^sub\s+?/.. /^}/){ print $_,$/; } } #### ... chomp; print $1, $/ if /^(?:.+)?\bsub\s+?(.+?){/; ## assumption still here if ( /^(.+)?\bsub\s+?(.+?)?{/s .. /^(.+)?}/s ) { ## anonymous sub included print $_, $/; } ...