use strict; use warnings; use Regexp::Common; my $str = "a< a>bca"; while ($str=~/\G(?:|$RE{balanced}{-parens=>'<>'}) ([^<]+) (?:|$RE{balanced}{-parens=>'<>'})/xg) { # Update: Oops, this uppercases everything except what # the OP wanted :) substr($str, $-[1],$+[1]-$-[1]) = uc $1; pos($str) = $+[1]; } #### $str =~ s/(^|\G$RE{balanced}{-parens=>'<>'})([^<]+)/\U$1\E$2/g; # Again? (and now I feel a DUH! coming on (: $str =~ s/($RE{balanced}{-parens=>'<>'})/\U$1/g;