Bienvenido a los foros de Perl en Español, lr_emilio.
El use utf8; sirve sólo si en tu
código fuente hay caracteres en utf8. Si la información la sacas de base de datos y archivos externos, no te sirve de nada.
Como mandas el
charset, entonces lo único que, en teoría, se debería hacer, sería una de estas dos líneas
binmode(STDOUT, ':encoding(UTF-8)'); # Perl hace una comprobación de que son datos UTF-8, de forma estricta
binmode(STDOUT, ':utf8'); # Perl admite los datos como que son UTF-8, sin comprobar
antes de imprimir. Más información en
perldoc -f binmodePero... también hay que tener en cuenta en qué están codificados los datos que recibes desde la base de datos. Dices que están en utf8, pero Perl no lo sabe.
Entonces... el proceso general es: todo dato externo que llegue al programa, le decimos a Perl en qué codificación está. Eso lo podemos hacer con un binmode() (en caso de leer de un archivo) o con alguna de las funciones del módulo
Encode, en caso de recibirlos desde la base de datos.
A partir de ese momento, Perl sabe que tiene cadenas de caracteres codificadas en Unicode. Y solo queda sacarlas fuera. Tenemos que decirle a Perl que esos datos en Unicode debe pasarlos a UTF-8. Por eso ponemos el binmode anterior, referido al STDOUT.
Más información y ejemplos en
Modern Perl, página 18.
Recomendable usar un Perl v5.12 o superior, pues incluye una característica nueva: "unicode_strings", que permite realizar operaciones con variables que contienen caracteres Unicode. Mejor aún: usar Perl v5.14 o superior.
Más información en tu propio ordenador en
perldoc perluniintro,
y en la Web.