Il modo migliore per impedire l'output di un elemento duplicato in Perl in tempo reale durante un ciclo
-
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]; }
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.