IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[Perl] Trie par nombre d'occurence a partir d'éléments présent dans une variable


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut [Perl] Trie par nombre d'occurence a partir d'éléments présent dans une variable
    Bonjour,

    Quel sujet bien compliqué n'est ce pas ?
    Laissez moi vous expliquer clairement ce que je n'arrive pas a programmer.


    Mon script doit lire un fichier acces.log qui se presente sous cette forme simplifié
    (c'est pas dur...je l'accorde...pas de souci sur ce point)

    xxxxxxxxxxxxx.com cdfrzczfvretyhryh
    www.lllllllllllllllllllll.com dedefdzfczerfzfzfr
    www.zzzzz.com fcoàfjozrifjzopr
    lllllllllllllllllllll.com njnjnjnjnjijklpmvretyhryh
    www.xxxxxxxxxxxxx.com aaaadfdcfkbhbkuljnl,pmyhryh
    lllllllllllllllllllll.com mqaazsc


    Ensuite: (attention ça se corse mais grave !)

    A partir des éléments connu dans un tableau précedent $table[0] :

    xxxxxxxxx
    llllllllllllllllll
    zzzzzzzzzz


    Celui-ci doit trier les lignes de ce log maniere décroissante (suivant le nombre d'occurence présente dans ce access.log)

    De tel sorte que si par exemple on a 3 fois llll 2 fois xxxx, 1 fois zzzzzz et le reste les élèment non présent dans le tableau $table[0]: on est

    lllllllllllllllllllll.com njnjnjnjnjijklpmvretyhryh
    lllllllllllllllllllll.com dedefdzfczerfzfzfr
    lllllllllllllllllllll.com mqaazsc
    xxxxxxxxxxxxx.com cdfrzczfvretyhryh
    xxxxxxxxxxxxx.com aaaadfdcfkbhbkuljnl,pmyhryh
    zzzzz.com fcoàfjozrifjzopr
    nonpresent dans la table $table[0].com czefvrepv,egrgth
    nonpresent dans la table $table[0].com czefvrepv,epbt,eptb,eprm


    Je demande l'aide à quelq'un qui saurais m'aider, je suis pas le genre de mec a demander de l'aide pour un rien, j'avoue que c'est très important pour moi et que je suis HS quant aux compétences que ca demande...

    Merci d'avance,

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Utilises la fonction sort sur ton tableau.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Merci pour cette réponse.

    Je savais que sort allais devoir etre utilisé, ce que je ne sais pas faire c'est trier en fonction de mon tableau $table[0] qui contien les elements a recherche dans mon fichiers access.log puis comment trier ces élèment par nombres d'occurence.

    sort oui... mais apres ? comment ?

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Il faut que tu nous donnes un peu de ton code. Difficile de t'aider sur du virtuel

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    ok,

    ca c'est mon code quis lis mon fichier reference qui va servir de base pour chercher mes occurences dans mon fichiers access.log:

    les infos de reference sont dans @table[0]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @lignes_vhost = ("");
    open(FILE, "</etc/apache2/vhost.conf");
    while(<FILE>){
            push(@lignes_vhost,$_);
    }
    close(FILE);
     
    for(@lignes_vhost){
     
            @test = split(/:/, $_);
            print "avant les : @test[0]\n";
            print "apres les : @test[1]\n";
            }
    je doit continuer mon script donc en triant le nombre d'occurence d'élèment (en décroissant) de mon fichier log en me basant sur le contenu de ce tableau.

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Pourriez vous faire un effort la prochaine fois de corriger les fautes d'orthographes. De plus, lorsque vous collez votre code, veuillez utiliser les balises codes (sélectionner votre code et cliquer sur #).

    Merci

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voici un exemple qui vous mettra sur la bonne voie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my @lignes_vhost = (
      'xxxxxxxxxxxxx.com cdfrzczfvretyhryh',
      'www.lllllllllllllllllllll.com dedefdzfczerfzfzfr',
      'www.zzzzz.com fcoàfjozrifjzopr',
      'lllllllllllllllllllll.com njnjnjnjnjijklpmvretyhryh',
      'www.xxxxxxxxxxxxx.com aaaadfdcfkbhbkuljnl,pmyhryh',
      'lllllllllllllllllllll.com mqaazsc'
    );
     
    foreach ( sort { ( split ':', $a )[0] cmp ( split ' ', $b )[0] } @lignes_vhost ) {
      print $_,"\n";
      my @test = split( / /, $_ );
      print "avant les : $test[0]\n";
      print "apres les : $test[1]\n";
    }
    Résultat :
    lllllllllllllllllllll.com mqaazsc
    avant les : lllllllllllllllllllll.com
    apres les : mqaazsc
    lllllllllllllllllllll.com njnjnjnjnjijklpmvretyhryh
    avant les : lllllllllllllllllllll.com
    apres les : njnjnjnjnjijklpmvretyhryh
    www.lllllllllllllllllllll.com dedefdzfczerfzfzfr
    avant les : www.lllllllllllllllllllll.com
    apres les : dedefdzfczerfzfzfr
    www.xxxxxxxxxxxxx.com aaaadfdcfkbhbkuljnl,pmyhryh
    avant les : www.xxxxxxxxxxxxx.com
    apres les : aaaadfdcfkbhbkuljnl,pmyhryh
    www.zzzzz.com fcoàfjozrifjzopr
    avant les : www.zzzzz.com
    apres les : fcoàfjozrifjzopr
    xxxxxxxxxxxxx.com cdfrzczfvretyhryh
    avant les : xxxxxxxxxxxxx.com
    apres les : cdfrzczfvretyhryh

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Merci pour votre réponse et désolé pour les fautes d'orthographes et de mise en forme.

    Je ne comprends pas le debut de votre code.
    En effet, le code que je vous ai donné lis un fichier de configuration (vhost.conf) qui se compose ainsi: vhost:path-log-du-vhost afin d'isoler la partie de réference (partie a gauche des qui me servira par la suite a trier.

    Ce fichier de conf est amené a évoluer (ajout de vhost...), pourquoi mettre les données de celui-ci en dur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my @lignes_vhost = (
      'xxxxxxxxxxxxx.com cdfrzczfvretyhryh',
      'www.lllllllllllllllllllll.com dedefdzfczerfzfzfr',
      'www.zzzzz.com fcoàfjozrifjzopr',
      'lllllllllllllllllllll.com njnjnjnjnjijklpmvretyhryh',
      'www.xxxxxxxxxxxxx.com aaaadfdcfkbhbkuljnl,pmyhryh',
      'lllllllllllllllllllll.com mqaazsc'
    );
    et pas ce servire de la variable $table[0] ?

    Merci en tous cas de votre aide.

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    N'ayant pas de fichier de configuration, j'ai créé un tableau en dur afin de faire un script d'exemple. Le but n'est pas que vous copiez le code au mot prêt, mais il vous donne juste une idée de la façon dont on peut s'y prendre. A vous de vous en inspirer pour réaliser le votre et nous le soumettre si besoin.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Je donnerais 1000€ pour avoir un cerveau compatible avec la programmation, je ne comprends rien à rien !

    :'(

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par barichon21 Voir le message
    Je donnerais 1000€ pour avoir un cerveau compatible avec la programmation, je ne comprends rien à rien !

    :'(
    Un peu d'efforts et de patience .
    Et pour la formation, cours et tutoriels pour apprendre la programmation PERL : http://perl.developpez.com/cours/

    Voilà, essaye maintenant de comprendre. Je t'ai mis beaucoup de commentaires.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $fichier = '/etc/apache2/vhost.conf';
     
    # Lecture de mon fichier
    open(FILE, '<', $fichier) or die("Impossible de lire le fichier $fichier\n");
    # Chargement du fichier en mémoire
    my @lignes_vhost = <FILE>;
    # Fermeture du fichier, du filehandle
    close(FILE);
     
    # Trions notre tableau 
    # Dans notre sort, on fait un split en fonction de :
    # car notre ligne ressemble à vhost:path-log-du-vhost
    # Puis le trie se fait en fonction du vhost (case 0 de notre tableau)
    foreach my $ligne ( sort { ( split ':', $a )[0] cmp ( split ' ', $b )[0] } @lignes_vhost ) {
      print "$ligne\n";
      my @test = split( /:/, $ligne );
      print "\t\t- avant les : $test[0]\n";
      print "\t\t- apres les : $test[1]\n\n";
    }

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ta patience, en tous cas c'est grâce a des gens comme toi que des gens comme moi arrivent peu à peu a y prendre "goût".

    Une petite question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp ( split ' ', $b )
    Pourquoi tu split aussi avec un espace ?

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par barichon21 Voir le message
    Merci beaucoup pour ta patience, en tous cas c'est grâce a des gens comme toi que des gens comme moi arrivent peu à peu a y prendre "goût".

    Une petite question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp ( split ' ', $b )
    Pourquoi tu split aussi avec un espace ?
    nos ligne ressemblent à celle ci
    www.lllllllllllllllllllll.com dedefdzfczerfzfzfr
    Il y a donc un espace séparant l'url du reste. Le but est de trier en fonction de l'url, donc pour l'obtenir, je fais un split par rapport l'unique espace et je trie

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Merci de ton aide !

    Ne te sauves pas lol !


    Merci encore !

  15. #15
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Si c'est OK, mets ton thread en résolu.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 27/07/2010, 15h52
  2. Réponses: 1
    Dernier message: 22/10/2007, 14h02
  3. [MySQL] Recherche puis classement par nombre d'occurences
    Par adrien357 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/07/2007, 09h22
  4. [MySQL] Comment récupérer le nombre d'élément présent dans une table
    Par TrX314 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/04/2007, 21h20
  5. Classement de résultats par nombre d'occurences
    Par pc.bertineau dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/03/2007, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo