sub UpperLower { my( $old, $new ) = @_; $new = lc $new; my @new = split //, $new; my @mask = map { uc $_ eq $_ } split //, $old; foreach (0..$#new) { $new[$_] = uc $new[$_] if $mask[$_]; } return join '' => @new; }