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;