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 :

PB de base en PERL


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut PB de base en PERL
    Bonjour,
    j'utilise le script perl suivant :

    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
    24
    if ($#ARGV < 0) { # si on n'a pas passé d'argument au programme
    	# on affiche un message
    	die("Usage : $0 nom_fichier");
    }
     
    # ouverture du fichier ou affichage d'un message (si erreur)
    open(FICH, $ARGV[0]) or die("Le fichier $ARGV[0] n'est pas accessible");
     
    # lecture du fichier ligne par ligne
    while ($ligne = <FICH>) {
    	chomp($ligne); # on se débarrasse des retours à la ligne
    	# split(' ', $ligne) retourne un tableau avec les mots de la ligne
    	# foreach parcours ce tableau
    	foreach $mot (split(' ', $ligne)) {
    		$compteur{$mot}++; # le tableau associatif %compteur va stocker les mots et leur nombre d'occurrence
    	}
    }
    # ne pas oublier de fermer le fichier
    close(FICH);
     
    # affichage du tableau associatif
    while (($mot, $nb) = each(%compteur)) {
    	print "$mot apparait $nb fois\n";
    }
    ce script compte le nombre de mots dans un fichier texte.
    Je cherche à trier les mots par ordre alphabétique en sortie.

    ex :
    le apparait 2 fois
    moineau apparait 3 fois
    taupe apparait 1 fois

    etc...

    Si quelqu'un a une idée ...

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    j'ai utilisé @keys=sort keys %hash;

    Mais ca ne marche pas visiblement;

  3. #3
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Il me semble que ton trie est bon , mais tu perd obligatoire les valeurs

    pense a imbriquer convenablement ton code sa rend la lecture plus agréable et aussi a mettre les balises [code]

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
     
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
     
    my (%$compteur);
     
    unless (scalar @ARGV > 0)
    {
      die("Usage : $0 file_name");
    }
     
     
    # ouverture du fichier
    open(FICH, $ARGV[0]) or die ("Le fichier $ARGV[0] n'est pas accessible");
     
    # lecture du fichier ligne par ligne
    while (my $ligne = <FICH>)
    {
       # on se débarrasse des retours à la ligne
       chomp($ligne); 
     
       foreach my $mot (split(' ', $ligne))
       {
           # le tableau associatif %compteur va stocker les mots et leur nombre d'occurrence
           $compteur{lc($mot)}++;
       }
    }
    # ne pas oublier de fermer le fichier
    close(FICH);
     
    # affichage du tableau associatif
    while (my ($mot, $nb) = each(%compteur))
    {
       print "$mot apparait $nb fois\n";
    }
    Everybody have in their the potential to be their own god : Marilyn Manson

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    par ordre alphabetique des mots (tri sur la clé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $mot (sort keys %compteur) {
      print "$mot apparait $compteur{$mot} fois\n";
    }
    par ordre d'occurence decroissante (tri sur la valeur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $mot (sort {$compteur{$b} <=> $compteur{$a}} keys %compteur) {
      print "$mot apparait $compteur{$mot} fois\n";
    }
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Merci pospos, ca marche nikel!!

    Et par exemple si en cas d'égalité sur le nombre d'occurence, l'affichage se fait par ordre alphabétique :

    dans apparait 3 fois
    les apparait 2 fois
    un apparait 2 fois ..

    C'est possible ou non tu penses?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    oui il suffit de le preciser dans ta sort sub:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $mot (sort {($compteur{$b} <=> $compteur{$a}) || ($a cmp $b)} keys %compteur) {
      print "$mot apparait $compteur{$mot} fois\n";
    }
    <=> et cmp (relativement pour la comparaison d'entier et lexicale) renvoie 1/0/-1 suivant que la valeur est plus petite/egale/plus grande

    donc dans ce cas si le compte est le meme la premiere comparaison renverra 0, et on passera donc le || pour arriver sur la seconde comparaison, lexicale sur la clé
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

Discussions similaires

  1. Les bases de Perl - partie 3
    Par djibril dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2013, 13h59
  2. PERL et Base de Données
    Par BnA dans le forum SGBD
    Réponses: 7
    Dernier message: 04/05/2006, 14h04
  3. Perl et base de registre
    Par spirit_epock dans le forum Langage
    Réponses: 11
    Dernier message: 15/03/2006, 18h30
  4. [sgbd] Connection base de donnée à partir de PERL
    Par martijan dans le forum SGBD
    Réponses: 7
    Dernier message: 07/07/2003, 13h35
  5. [sgbd] Accès au base de données en Perl
    Par totox17 dans le forum SGBD
    Réponses: 3
    Dernier message: 24/02/2003, 16h05

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