Código:código Comprensión: Hash, grep de duplicados (modificados para verificar si hay múltiples elementos)
@all_matches = grep
{
! ($seensentence
{
$_->[0] .'-'. $_->[1] .'-'. $_->[5]
}
++)
}
@all_matches;
Propósito: Este código elimina duplicados de ciertos elementos de la matriz @all_matches
que es un AoA.
Mi intento de desglose completo (con ?? .. ?? alrededor de donde estoy seguro):
Grep devuelve los elementos de @all_matches
que devuelven verdadero.
La clave del hash %seensentence
es ?? los tres elementos ?? de @all_matches
. Como un hash solo puede tener claves únicas, la primera vez en su valor se incrementa de undef (0) a 1. La próxima vez, es un valor definido, pero !
significa que grep lo devuelve solo si es undef (valor único asociado con ese elemento).
Mis preguntas:
(1) ¿Cómo se puede convertir en un {$_->[0] .'-'. $_->[1] .'-'. $_->[5]}++
I HoH?
Me dijeron que esta es otra forma (idiomática) de lograrlo. Una puñalada en la oscuridad sería:
({$_->[0] => 0,
$_->[1] => 0,
$_->[5] => 0})++
(1b) Debido No entiendo cómo el original está haciendo lo que yo quiero que haga. Leí que -bareword
es equivalente a "-bareword"
así que probé: {"$_->[0]" . "$_->[1]". "$_->[5]"}
y parecía funcionar exactamente igual. Todavía no entiendo: ¿está tratando cada elemento como una clave (a) por separado (como un conjunto de teclas) o es (b) Corregir: todos simultáneamente (ya que .
los concatena a todos en una cadena) o es (c) no hacer lo que creo que es?
(2) ¿Qué significa esto: $_->[0] || $_->[1] || $_->[5]
? No hace lo mismo que arriba.
Leí que: los operadores lógicos de cortocircuito devuelven el último valor, por lo que verificaría un valor en {$_->[0]}
y si hubiera uno, pensé que el valor allí se incrementaría, si no comprobaría el siguiente elemento hasta que ninguno fueron verdaderas, que es cuando grep pasa el valor único.
Gracias por su tiempo, yo tratamos de ser lo más completa posible (a una falla?), Pero quiero saber si hay algo que falta.
Pregunta muy bien compuesta! – DavidO