El código correspondiente sería:
use strict;
use warnings;
use File::Slurp;
@ARGV || die "Uso: $0 <fichero de entrada>\n";
my %indice;
my $text = read_file( $ARGV[0] ) ;
my @palabras=split(" ", $text);
my $contador = 0;
for (@palabras){
if (/[a-záéíóúñ]+/){
$indice{$_} = 0;
}
}
for (@palabras) {
if (/[a-záéíóúñ]+/) {
$indice{$_} =$indice{$_}+1;
}
}
#for (sort {length($indice{$b}) cmp
length($indice{$a})} keys %indice ) {
for (sort {$indice{$b} <=> $indice{$a}}
keys %indice){
$contador++;
if($contador<=50){
print $_, " = ", $indice{$_},"\n";
}
}
En cuanto a la línea comentada, la primera no funciona y la explicación parece estar en el siguiente trozo de la documentación de perldoc:
Equality Operators
Binary "<=>" returns -1, 0, or 1 depending on whether the left argument is numerically less than, equal to, or greater than the right argument.
Binary "cmp" returns -1, 0, or 1 depending on whether the left argument is stringwise less than, equal to, or greater than the right argument.
<=> compara numéricamente, por tanto, como nuestros valores lo son, es el correcto. Usando cmp y la longitud no nos sirve, puesto que entiende que 8 es menor que 2 pero mayor que 12. A continuación tenemos las salidas para cada caso:
Usando sort {length($indice{$a})cmp length($indice{$b})}:
Usando sort {$indice{$a} <=> $indice{$b}}:
No hay comentarios:
Publicar un comentario