Meilleure façon d'empêcher la sortie d'un élément en double dans Perl en temps réel pendant une boucle

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

  •  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];
    }
    
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top