Sí, el proceso de averiguar elementos comunes o cuántas veces aparecen es muy normal hacerlo con
hash.
En el primer bucle se recorren todos los valores del
array o lista de valores. Por cada uno, se actualiza (se incrementa en uno) el contador de veces que aparece. Naturalmente, la primera vez que aparece un valor, no existe su entrada en el
hash, pero al hacer referencia a él, Perl lo crea, y al incrementarlo (mejor dicho, post-incrementarlo con
++) se toma su valor (que será 0
(*) al principio) y lo incrementa en uno.
El resultado es que tenemos un
hash, cuyas claves son los elementos únicos del
array, y sus valores, las veces que aparecen.
En el segundo bucle, recorremos para todas las claves (keys) del
hash. Por cada una, sacamos las veces que se repite. Si las veces que se repite supera el $max, nos quedamos con su cara (perdón, nombre).
Escrito de otra manera:
Using perl Syntax Highlighting
# con un hash contamos cuántas veces aparece cada cadena:
my %veces;
foreach my $elemento (@array) {
$veces{$elemento}++; # El $elemento aparece una vez más
}
# y luego buscamos en el hash la entrada que tiene la cuenta más alta:
my $elemento_mas_repetido;
my $maximo_numero_veces = 0;
foreach my $elemento (keys %veces) { # Para todos los elementos únicos
if ($veces{$elemento} > $maximo_numero_veces) { # Si el $elemento supera el récord
$elemento_mas_repetido = $elemento; # nos quedamos con su nombre
$maximo_numero_veces = $veces{$elemento}; # anotamos el nuevo récord
}
}
print "$elemento_mas_repetido aparece $maximo_numero_veces veces\n"Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
(*) En realidad, el valor no es 0, sino indefinido (undef), pero al hacer la operación matemática de post-incremento, el valor de indefinido lo transforma a 0