Dans le code suivant, nous faisons une écriture dans un fichier si le mail ($tmp) que l'on reçoit dans $mesg->entries n'est pas déjà présent dans notre fichier.

Plutôt que de parcourir le fichier a chaque fois, j'ai préféré faire une liste de hashage et d'y mettre les emails traités au fur et à mesure de la boucle, et vérifier dans cette dernière si le mail était déjà présent.

La variable $mesg est bien évidemment chargée plus en amont dans mon code, mais cette partie ne nous intéresse pas ici.

Voici donc ce que ça donne :

my $UserCount = 0;
open(OUT,">$TmpFile");
flock(OUT, LOCK_EX);
 
# Hash vide pour dédoublonner les mails que l'on va récupérer
%mailhash = ();
 
# Filtering results for name variations.
foreach my $entry ( $mesg->entries ) {
     $UserCount++;
     $tmp=$entry->get_value("mail");
     $tmp=lc($tmp);
 
# Si le mail est déja dans la liste on ne fait rien
     if ( exists ( $mailhash{$tmp} ) ) {
        #print "Doublon trouvé : $tmp\n";
     } else {
 
        #print "Youhou c'est passé ! \n";
# Sinon on l'ajoute au hashlist et on continue
        $mailhash{$tmp}=1;
 
# On ne prend pas certains emails non plus
        next if ($tmp=~/_tous/); # si le mail ne contient pas "_tous"
        next if ($tmp=~/^membres/); # si le mail ne commence pas par "membres_"
 
# On vire le catchall
        next if ($tmp=~/^\@cp2i.com/);
 
# Ecriture de l'email dans le fichier
        print OUT "$tmp\n";
 
     }
}
flock(OUT, LOCK_UN);
close(OUT);

En espérant que cela vous a aidé :)