use strict; use warnings; my $text = join q{}, ; my $newtext = q{}; while ($text =~ m{ \G # start where we left (.*?) # text to be mangled (?: # followed by STARTPATTERN # the start of verbatim mark (.*?) # the text to be taken verbatim ENDPATTERN # the end of verbatim mark )? # must not be always present }xmsg) { # add the mangled version of the text $newtext .= mangle($1); if (defined $2) { # if there is a verbatim part, copy it verbatim $newtext .= $2; } } print $newtext; exit 0; sub mangle { return uc $_[0]; } __DATA__ Once upon STARTPATTERNa timeENDPATTERN there was a Perl monk. STARTPATTERNBy steadily trainingENDPATTERN the great virtues he became very wise... #### ONCE UPON a time THERE WAS A PERL MONK. By steadily training THE GREAT VIRTUES HE BECAME VERY WISE...