word_freq.pl en Perl
Un reporte de frecuencia de palabras sobre un pasaje incrustado, impulsado por un solo hash.
use strict;
use warnings;
# word_freq: count word occurrences in an inline passage
my $text = <<'TEXT';
The quick brown fox jumps over the lazy dog.
The dog barks; the fox runs. Quick thinking, that fox.
TEXT
my @words = lc($text) =~ /[a-z]+/g;
my %freq;
$freq{$_}++ for @words;
printf "words total: %d\n", scalar @words;
printf "words unique: %d\n", scalar keys %freq;
my @ranked = sort { $freq{$b} <=> $freq{$a} or $a cmp $b } keys %freq;
print "top 5:\n";
for my $word (@ranked[0 .. 4]) {
printf " %-8s %d\n", $word, $freq{$word};
}
my @once = sort grep { $freq{$_} == 1 } keys %freq;
print "seen once: ", join(", ", @once), "\n";
Cómo funciona
- Una coincidencia en contexto de lista,
lc($text) =~ /[a-z]+/g, extrae cada palabra en minúsculas. $freq{$_}++ for @wordsconstruye toda la tabla de frecuencias en una línea.- Un
sortde dos claves ordena por conteo y luego alfabéticamente para desempatar. grep { $freq{$_} == 1 }se queda con las palabras vistas una sola vez.
Palabras clave y builtins usados aquí
forgrepjoinkeyslcmyprintprintfscalarsortuse
El intento, en números
- Líneas
- 27
- Caracteres a escribir
- 642
- Tokens
- 155
- Ritmo de tres estrellas
- 80 tpm
Al ritmo de tres estrellas de 80 tokens por minuto, este intento toma unos 116 segundos.
Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.