[Perl] classer des e-mails en fonction du fournisseur

classer des e-mails en fonction du fournisseur [Perl] - Perl - Programmation

Marsh Posté le 27-07-2003 à 13:07:40    

Bonjour,
 
j'ai un petit soucis de programmation, merci de votre aide...
 
soit un tableau associatif, %confirm dont les clés sont des adresses e-mail.
 
Je voudrais classer ces clés, en fonction du fournisseur, donc en fonction de la deuxième partie de l'e-mail (aprés le @)
 
J'aurais ainsi une liste ou je verrais d'abord tous les
@club-internet.fr
@free.fr
@wanadoo.fr
 
etc...
 
je dois admettre que je ne sais pas trop comment m'y prendre....merci d'avance.

Reply

Marsh Posté le 27-07-2003 à 13:07:40   

Reply

Marsh Posté le 27-07-2003 à 14:11:03    

commence par faire un split sur le caractère @
 
à partir de là, soit tu te fais un tri manuel, soit tu cherches une fonction de sort


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 27-07-2003 à 15:13:43    

Introduction à Perl, chez O'reilly est un très bon bouquin pour commencer le perl.
 
CHaiCA

Reply

Marsh Posté le 27-07-2003 à 16:41:34    

tu te fait une fonction de tri (non testé):
 

Code :
  1. sub triFournisseur {
  2.   (undef, my $fournisseur_a) = split(/@/, $a);
  3.   (undef, my $fournisseur_b) = split(/@/, $b);
  4.   return lc($fournisseur_a) cmp lc($fournisseur_b)
  5. }


 
et ensuite tu l'utilise pour trier tes clés dans un foreach par exemple:
 

Code :
  1. foreach my $cle (sort triFournisseur (keys %confirm)) {
  2.    print "Fournisseur $cle: ", $confirm{$cle},"\n";
  3.    #je ne sait pas ce que representent les valeurs dans ton hash...
  4. }


 
et evidement tu peux avoir la liste triée des fournisseur comme ca:
 

Code :
  1. my @listeFournisseurs = (sort triFournisseur (keys %confirm));


Message édité par pospos le 27-07-2003 à 16:42:38
Reply

Marsh Posté le 28-07-2003 à 13:56:04    

Merci Pospos, ça fonctionne vraiment trés bien !
Je ne comprend pas trop le sous-programme, notament l'usage du cmp..mais en tout cas, ça fonctionne d'enfer !
 
Merci et a+

Reply

Marsh Posté le 28-07-2003 à 14:04:15    

c'est assez simple, il prend les noms de domaine ( la partie après le @ ) et ensuite les compare tous les deux.
Il reduit la casse des noms de domaine pour être sur de sa comparaison ( lc() ) puis il les compare avec cmp ( comparateur de string d'ailleurs j'ai jamais trop compris la différence entre cmp et eq ...). Vu que cmp retourne 1 ou 0 et que c'est ce qu'il faut pour le sort, et bien il retourne le resultat de la comparaison directement!

Reply

Marsh Posté le 28-07-2003 à 18:35:54    

de rien Ethan
pour le eq et le cmp c'est la meme differnece qu'entre le == et le <=>:
il retourne -1,0 ou 1 suivant k'il est plus petit, egale, ou plus grand
 
en fait triFournisseur() est une fonction de tri, et les variables $a et $b sont des variables speciales. Pour chaque element du tableau la focntion de tri est appelé, et $a et $b representent deux element qui se suivent. la fonction de tri va donc retourner -1,0, ou 1 (suivant la logique qu'a decrit Anapajari)pour indiquer à la fonction sort dans kelle ordre elle doit placer ces elements.
 
en fait la fonction de tri par defaut est $a<=>$b (ou $a cmp $b pour les strings) mais on peu implementer sa propre fonction de tri comme dans ce cas la
 
a+

Reply

Marsh Posté le 29-07-2003 à 13:16:40    

Ok, merci pour toutes ces explications.
 
Ce que je ne comprend pas (je rappelle que je suis débutant, et que le programmation n'est pas du tout mon domaine), c'est $a et $b, je ne comprend pas d'ou ils sortent...
 
Merci.

Reply

Marsh Posté le 29-07-2003 à 13:34:47    

$a et $b c'est en qq sorte les parametres de ta fonction de tri, ce sont deux elements consecutifs dans le tableau (et la fonction est appelé pour chaque couple du tableau)
C'est des variables "speciales" pour les fonction de tri
 

Citation :

sort SUBNAME LIST
sort BLOCK LIST
sort LIST
This function sorts the LIST and returns the sorted list value. By default, it sorts in standard string comparison order (undefined values sorting before defined null strings, which sort before everything else). SUBNAME, if given, is the name of a subroutine that returns an integer less than, equal to, or greater than 0, depending on how the elements of the list are to be ordered. (The handy <=> and cmp operators can be used to perform three-way numeric and string comparisons.) In the interests of efficiency, the normal calling code for subroutines is bypassed, with the following effects: the subroutine may not be a recursive subroutine, and the two elements to be compared are passed into the subroutine not via @_ but as $a and $b (see the examples below). The variables $a and $b are passed by reference, so don't modify them in the subroutine. SUBNAME may be a scalar variable name (unsubscripted), in which case the value provides the name of (or a reference to) the actual subroutine to use. In place of a SUBNAME, you can provide a BLOCK as an anonymous, in-line sort subroutine.
 
To do an ordinary numeric sort, say this:
 
sub numerically { $a <=> $b; }
@sortedbynumber = sort numerically 53,29,11,32,7;
To sort in descending order, simply reverse the $a and $b. To sort a list value by some associated value, use a hash lookup in the sort routine:
 
sub byage {
    $age{$a} <=> $age{$b};
}
@sortedclass = sort byage @class;
As an extension of that notion, you can cascade several different comparisons using the handy comparison operators, which work nicely for this because when they return 0 they fall through to the next case. The routine below sorts to the front of the list those people who are first richer, then taller, then younger, then less alphabetically challenged. We also put a final comparison between $a and $b to make sure the ordering is always well defined.
 
sub prospects {
    $money{$b} <=> $money{$a}
       or
    $height{$b} <=> $height{$a}
       or
    $age{$a} <=> $age{$b}
       or
    $lastname{$a} cmp $lastname{$b}
       or
    $a cmp $b;
}
@sortedclass = sort prospects @class;
To sort fields without regard to case, say:
 
@sorted = sort { lc($a) cmp lc($b) } @unsorted;
And finally, note the equivalence of the two ways to sort in reverse:
 
sub backwards { $b cmp $a; }
@harry = qw(dog cat x Cain Abel);
@george = qw(gone chased yz Punished Axed);
print sort @harry;                   # prints AbelCaincatdogx
print sort backwards @harry;         # prints xdogcatCainAbel
print reverse sort @harry;           # prints xdogcatCainAbel
print sort @george, "to", @harry;    # Remember, it's one LIST.
        # prints AbelAxedCainPunishedcatchaseddoggonetoxyz
Do not declare $a and $b as lexical variables (with my). They are package globals (though they're exempt from the usual restrictions on globals when you're using use strict). You do need to make sure your sort routine is in the same package though, or qualify $a and $b with the package name of the caller.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed