Meilleure façon d'empêcher la sortie d'un élément en double dans Perl en temps réel pendant une boucle
-
03-07-2019 - |
Question
Je vois beaucoup de questions "liées" apparaître, mais aucune d’elles n’a regardé répondre à ce scénario spécifique.
Au cours d’une boucle while / for analysant un jeu de résultats généré à partir d’une instruction de sélection SQL, quel est le meilleur moyen d’empêcher la sortie de la ligne suivante si celle-ci contient les mêmes données de champ (que champ ou le xième champ)?
Par exemple, si deux lignes sont:
('EML-E','jsmith@mail.com','John','Smith')
('EML-E','jsmith2@mail.com','John','Smith')
Quel est le meilleur moyen d'imprimer uniquement la première ligne en se basant sur le fait que "EML-E" est identique dans les deux lignes?
En ce moment, je fais ceci:
- Stockage du premier champ (spécifique à mon scénario) dans un tableau à 2 éléments (dupecatch [1])
- Vérification si dupecatch [0] = dupcatch [1] (copie - boucle d'échappement utilisant 's')
-
Après le traitement de la ligne, définissez 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]; }
La solution
Telle est la méthode habituelle si vous ne vous souciez que des éléments en double dans une ligne, mais $ dupecatch [0] est normalement nommé $ old et $ dupecatch [1] normalement uniquement la variable en question. Vous pouvez dire que le tableau ne convient pas, car vous ne faites jamais référence à ses index.
Si vous souhaitez éviter tous les doublons, vous pouvez utiliser un hachage% vu:
my %seen;
while (defined (my $row = get_data())) {
next if $seen{$row->[0]}++; #skip all but the first instance of the key
do_stuff();
}
Autres conseils
Je suggère d'utiliser DISTINCT dans votre instruction SQL. C’est probablement de loin la solution la plus simple.