No es
@texto[$i], sino
$texto[$i].
El sigilo que va delante de la variable indica el tipo de dato que queremos obtener. '@' es para una lista, '$' para un escalar (un solo valor).
Mira lo que le acabo de responder a Doddy.
En cuanto al problema, todo lo que tenga que ver con las codificaciones de texto, es un pequeño infierno.
Hace poco que hemos iniciado una serie sobre el tema, en el subforo de avanzado:
44 recetas para trabajar con Unicode en Perl.
En resumen:
* si tienes literales utf8 en tu código (porque lo estás creando con un editor con codificación utf8), entonces debes poner el 'use utf8;' al principio
* si vas a leer archivos codificados así, hay que usar algo como el módulo
utf8::all (con lo que además, puedes quitar el 'use utf8;' anterior), o usar el pragma open (como se indica en la receta 0 enlazada antes). El objetivo es que los archivos que vamos a leer pasen por alguna capa E/S de traducción de codificaciones, para que los pase de uf8 al formato interno de Perl, que es Unicode (no confundir con utf8). A la hora de sacar la información hay que tener la misma preocupación.
* Otro tema son las expresiones regulares (tr incluido), pero con el 'use utf8' debería ser suficiente:
Using bash Syntax Highlighting
> perl -E 'use utf8; $_ = "éeeeeéée"; $v = tr/é//; say $v'
3
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Hay varios documentos en Perl que tratan el asunto del Unicode:
perlunitut,
perluniintro y
perlunicode.
El siguiente ejemplo sí que me funciona:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
use utf8;
use open qw<:utf8 :std>; # Entradas y salidas estándar en modo utf8
my @palabras = qw< belén >;
my $número_letras_e = $palabras[0] =~ tr/e//;
my $número_letras_é = $palabras[0] =~ tr/é//;
my $número_otras_vocales = $palabras[0] =~ tr/aiouáíóúü//;
if ($número_letras_e == 1
and $número_letras_é == 1
and $número_otras_vocales == 0
) {
say "Encontrado";
}
__END__
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4