He escrito una función con la intención de que a partir de una referencia a un hash con los trigramas como claves y su número de apariciones en una cadena como valores, y de una cadena de la que se ha calculado ese hash mediante otra función, me almacene en un hash los trigramas repetidos y los lugares de la cadena en que aparecen.
Pero no funciona. Ni a tiros.
Using perl Syntax Highlighting
- sub análisis_frec{
- #Recibe una referencia a un hash que contiene las cadenas (digramas o trigramas)
- #relacionadas con sus repeticiones, y una cadena con el mensaje cifrado.
- #Retorna un hash que relaciona cada cadena, (digrama o trigrama), con
- #la distancia en caracteres entre cada repetición.
- my %dist;
- my @dist_por_elemento;
- my %input = %{$_[0]}; #Dereferencio el hash recibido
- foreach(sort keys %input){
- #print "Clave ", $_, " valor ", $input{$_}, "\n";
- if($input{$_} > 1){ #Dejamos sin procesar los elementos que no aparecen repetidos
- my $offset = 0; #Es el offset que pasaré a index()
- my $distancia;
- for(my $i = 0; $i < $input{$_}; $i++){ #Para cada una de las veces que aparece cada trigrama
- $distancia = index $_[1], $_, $offset;#$_[1] almacena la cadena con el mensaje
- #EDIT ¡Barbaridad! $dist_por_elemento[$i]= $distancia;
- push @dist_por_elemento, $distancia;
- #EDIT ¡Vergonzoso! $offset += 2; #¿No puedo usar length porque estoy trabajando con caracteres no ascii??
- $offset = $distancia + 2;
- #print "Longitud ", $offset, "\n";
- }
- #print "debug ",(split ',', @dist_por_elemento), "\n";
- $dist{$_} = [@dist_por_elemento]; #AQUÍ ESTABA EL PROBLEMA: tenía $dist{$_} = @dist_por_elemento;
- undef @dist_por_elemento;
- }
- }
- return \%dist;
- }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
EDITADO [Aparentemente calcula bien los desplazamientos, pero no los guarda en el array que deseo convertir en valor de cada clave del hash que retorna la función]. No era ese el problema.
Además tengo la duda de si con el módulo utf8::all funciona correctamente la función length(). Aquí me ha dado problemas, pero podrían haberse debido a la "creatividad" con que acometo el trabajo con hashes en estos momentos...
Un saludo.
EDITO[PS: He visto un montón de errores de lógica, y de aún sentido común, en el código que ya he editado. Aun con todo, no consigo ver por qué no funciona
Using perl Syntax Highlighting
- push @dist_por_elemento, $distancia;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
PS: No hay como pensar.