Bienvenido a los foros de Perl en Español, dgf.
Es cosa de la codificación del programa.
Por ejemplo. Yo estoy trabajando con Linux, en una terminal con codificación UTF8
Using bash Syntax Highlighting
explorer
@joaquin:~
> echo $LANG
es_ES.UTF-
8Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Si ejecuto el programa en línea
Using bash Syntax Highlighting
explorer
@joaquin:~
> perl -le '$x = "Joaquín"; $x =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/; print $x'
Joaquaun
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
me sale el error que comentas. Esto es debido a que cada carácter acentuado que vemos en la variable $x está ocupando dos bytes en el programa. Y por eso tr() hace dos conversiones.
Hay que decirle a Perl que estamos manejando caracteres con codificación utf8, porque, por defecto, Perl piensa que siempre estamos con la codificación iso-8859-1 (latin1):
Using bash Syntax Highlighting
explorer
@joaquin:~
> perl -le 'use utf8; $x = "Joaquín"; $x =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/; print $x'
Joaquin
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Si, en esa misma terminal, arranco un editor de textos, y le configuro para que trabaje con otra codificación, que sea la iso-8859-1, entonces
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict
;
use warnings
;
use diagnostics
;
my $x = "Joaquín";
$x =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/;
print $x;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
genera también la salida correcta, debido a que todos los caracteres acentuados que hay dentro del programa están codificados de la misma manera y además pertenecen a la codificación predeterminada de Perl. Si estuviéramos codificando en otra distinta, deberíamos hacer conversiones con otro tipo de módulos, como por ejemplo Encode.
Debes mirar en qué codificación estás trabajando. O usar el módulo indicado antes.