Il modo migliore per impedire l'output di un elemento duplicato in Perl in tempo reale durante un ciclo

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

  •  03-07-2019
  •  | 
  •  

Domanda

Vedo apparire molte domande "correlate", ma nessuna delle quali ho guardato risponde a questo specifico scenario.

Durante un ciclo while / for che analizza un set di risultati generato da un'istruzione di selezione SQL, qual è il modo migliore per impedire che la riga successiva venga emessa se la riga prima contiene gli stessi dati del campo (sia che si tratti del 1o campo o il campo X))

Ad esempio, se due righe fossero:

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

Qual è il modo migliore per stampare solo la prima riga in base al fatto che 'EML-E' è lo stesso in entrambe le righe?

In questo momento, lo sto facendo:

  • Memorizzazione del primo campo (specifico per il mio scenario) in un array di 2 elementi (dupecatch [1])
  • Verifica se dupecatch [0] = dupcatch [1] (duplicato - escape loop usando 's')
  • Dopo l'elaborazione della riga, impostare 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];
    }
    
È stato utile?

Soluzione

Questo è il modo standard se ti preoccupi solo di elementi duplicati di fila, ma $ dupecatch [0] è normalmente chiamato $ old e $ dupecatch [1] normalmente solo la variabile in questione. Puoi dire che l'array non è adatto perché fai sempre riferimento ai suoi indici.

Se vuoi evitare tutti i duplicati puoi usare 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();
}

Altri suggerimenti

Suggerisco di usare DISTINCT nell'istruzione SQL. Questa è probabilmente la soluzione di gran lunga più semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top