Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2807 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°468891
Ethan_cart​er
Posté le 27-07-2003 à 13:07:40  profilanswer
 

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.

mood
Publicité
Posté le 27-07-2003 à 13:07:40  profilanswer
 

n°468914
burgergold
5$? va chez l'diable!
Posté le 27-07-2003 à 14:11:03  profilanswer
 

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
n°468944
chaica
Posté le 27-07-2003 à 15:13:43  profilanswer
 

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

n°468970
pospos
Posté le 27-07-2003 à 16:41:34  profilanswer
 

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
n°469733
Ethan_cart​er
Posté le 28-07-2003 à 13:56:04  profilanswer
 

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+

n°469750
anapajari
s/travail/glanding on hfr/gs;
Posté le 28-07-2003 à 14:04:15  profilanswer
 

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!

n°470133
pospos
Posté le 28-07-2003 à 18:35:54  profilanswer
 

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+

n°470854
Ethan_cart​er
Posté le 29-07-2003 à 13:16:40  profilanswer
 

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.

n°470887
pospos
Posté le 29-07-2003 à 13:34:47  profilanswer
 

$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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

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

 

Sujets relatifs
[PHP ou PERL] Cherches script pour avoir les requetes de recherchedefinir une touche qui lancera une fonction a n importe quel moment ?
besoin de testeurs: retour de fonctionPortail en perl
Changer une image en fonction de la sélection d'un menu déroulant ?listbox qui se place en fonction des caracteres tapés
[PERL] Rechercher un / avec une regexfonction de remplacement de html_entity_decode()
Dans excel : affecter un intitulé en fonction d'une valeur[Perl] Cgi de redirection
Plus de sujets relatifs à : [Perl] classer des e-mails en fonction du fournisseur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR