La mejor manera de evitar la salida de un elemento duplicado en Perl en tiempo real durante un bucle

StackOverflow https://stackoverflow.com/questions/820423

  •  03-07-2019
  •  | 
  •  

Pregunta

Veo que aparecen muchas preguntas "relacionadas", pero ninguna que haya respondido a este escenario específico.

Durante un bucle de while / for que analiza un conjunto de resultados generado a partir de una instrucción de selección de SQL, ¿cuál es la mejor manera de evitar que la siguiente línea se muestre si la línea anterior contiene los mismos datos de campo (ya sea la primera línea)? campo o el campo x)?

Por ejemplo, si dos filas fueran:

('EML-E','jsmith@mail.com','John','Smith')
('EML-E','jsmith2@mail.com','John','Smith')

¿Cuál es la mejor manera de imprimir solo la primera fila basándose en el hecho de que 'EML-E' es el mismo en ambas filas?

En este momento, estoy haciendo esto:

  • Almacenar el primer campo (específico para mi escenario) en una matriz de 2 elementos (dupecatch [1])
  • Comprobando si dupecatch [0] = dupcatch [1] (duplicar - bucle de escape usando 's')
  • Después de procesar la fila, configura dupecatch [0] = dupecatch [1]

    while ($DBS->SQLFetch() == *PLibdata::RET_OK)
    {
        $s=0; #s = 1 to escape out of inside loop
        while ($i != $array_len and $s==0)
        {
            $rowfetch = $DBS->{Row}->GetCharValue($array_col[$i]);
            if($i==0){$dupecatch[1] = $rowfetch;} #dupecatch prevents duplicate primary key field entries
            if($dupecatch[0] ne $dupecatch[1])
            {
                dosomething($rowfetch);
            }
            else{$s++;}
            $i++;
        }
        $i=0;
        $dupecatch[0]=$dupecatch[1];
    }
    
¿Fue útil?

Solución

Esa es la forma estándar si solo te preocupan los elementos duplicados en una fila, pero $ dupecatch [0] normalmente se llama $ old y $ dupecatch [1] normalmente solo la variable en cuestión. Puedes decir que la matriz no es una buena opción porque solo te refieres a sus índices.

Si desea evitar todos los duplicados, puede usar un hash% visto:

my %seen;
while (defined (my $row = get_data())) {
    next if $seen{$row->[0]}++; #skip all but the first instance of the key
    do_stuff();
}

Otros consejos

Sugiero usar DISTINCT en su declaración SQL. Probablemente esa sea la solución más fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top