lunes, 28 de abril de 2008

Ejercicio 4

En el siguiente ejercicio tenemos que hacer un ranking con las 50 palabras en minúscula que más se utilicen en el texto.
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: