Primero deberíamos saber en qué codificación estamos trabajando... lo que es mayúsculas y minúsculas depende de la localización que estemos usando.
Si, por ejemplo, la cadena se compone de bytes, en codificación iso-8859-1 o latin1 o familiar, se podría hacer sencillo como esto:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my $cadena = 'HoLa qUe TAl';
print "$cadena\n";
for (split//,$cadena) { # para cada cadena
if (/[[:alpha:]]/) { # si es carácter alfabético (en iso-8859-1)
$_ ^= chr 0x20; # invertimos el bit 6, ya que hay una diferencia
# de 32 caracteres entre las mayúsculas y las minúsculas
}
print; # y pintamos el resultado
}
print "\n";
__END__
HoLa qUe TAl
hOlA QuE taL
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
El problema es que esta solución no es muy portable, entre distintas codificaciones.