Using perl Syntax Highlighting
- sub gen_trío{
- #En este caso no voy a generar todos los tríos de caracteres posibles
- #sino únicamente los que pueden aparecer en la cadena.
- #Recibe la cadena con el cifrado y devuelve una referencia a un array
- #con los grupos de tres caracteres existentes.
- my %frec_grupos;
- my @cadena = split //, $_[0];
- my @grupos;
- for(my $index = 0; $index <= $#cadena; $index++){
- if(($index + 2) <= $#cadena){
- $grupos[$index]=join '', @cadena[$index .. $index +2];
- }
- }
- @frec_grupos{@grupos} = 1;
- @grupos = sort keys %frec_grupos;
- return \@grupos;
- }
- sub frecuencia{
- #Recibe una referencia a un array de cadenas de caracteres sin repetir y una cadena con
- #el mensaje. Devuelve una referencia a un hash con las frecuencias.
- my %frec; #Estructura a retornar
- @frec{@{$_[0]}}=0; #Iniciamos el hash con los valores a distribuir
- foreach(keys %frec){
- my @control;
- @control=$_[1] =~m/$_/g;
- $frec{$_}=@control;
- }
- return \%frec;
- }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
He estado mucho rato dándole vueltas a la sentencia que realiza el recuento en la segunda función:
Using perl Syntax Highlighting
- @control=$_[1] =~m/$_/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Nunca lo había pensado... ¿Cómo opera el modificador /g sobre el operador m//? Porque, de hecho, lo convierte en una función más que en un operador, y desde luego con una finalidad totalmente diferente. ¿No?
Tampoco entiendo que, existiendo m//g, no sea el propio operador "match" quien realice las tareas de las funciones index() y rindex(), (m//g me parece de mucho más "alto nivel"). De hecho, y cuanto más lo pienso, la labor realizada por m//g me parece más propia de una función que de un operador. A priori casi esperaría que la labor de index() la realizara el propio m// mediante el modificador correspondiente.
¿Razones histórica del desarrollo de Perl? ¿Peculiaridades sintácticas? ¿Es correcto lo que expongo?
Un saludo.