Интересно, работает ли пример из perlfaq для не ASCII?Вариант, в котором не используется взлом XOR, может быть:
$text =~ s{$str_to_replace}{my $i=0;join "",map {substr($&,$i++,1)=~/\p{IsLower}/?lc:uc} split //,$str_to_substitute}ieg;
Но это работает, только если модификатор /i
поддерживает локаль (см. Perllocale).