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 :

Tableau scalaire + compteur


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut Tableau scalaire + compteur
    Bonjour,
    Le but est de compter le nombre des mots d'un fichier texte. Dans le code ci-dessous, pourriez-vous me dire pourquoi $nbmots = $nbmots + @motsdans1ligne donne le résultat des nombres des mots,
    @motsdans1ligne est un tableau scalaire, pourquoi on peut additionner $nbmots qui est un compteur.

    Merci beaucoup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $nbmots = 0;
    foreach $ligne (@texte)
    {
    $ligne=~s/[0-9,;:!\?\.\-\<\>\=\(\)\'\s\t]+/ /g;
    @motsdans1ligne = split(/ /, $ligne);
    $nbmots = $nbmots + @motsdans1ligne;
    }
    print "Nombre des mots du fichier : ".$nbmots."\n";

  2. #2
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    D'abord, un point de vocabulaire : en Perl, il y a les données de liste, et les données scalaires. Un tableau est une variable contenant une liste. Donc, parler de "tableau scalaire" n'a pas de sens.

    Ensuite, une notion importante semble t'échapper, la notion de contexte. Je te renvoie à la documentation, comme par exemple ce cours.
    Dans la ligne "$nbmots = $nbmots + @motsdans1ligne;" le tableau @motsdans1ligne est utilisé en contexte scalaire (en tant que terme d'une addition), et a donc pour valeur son nombre d'éléments.

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    J'écrirais ça plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub word_count {
        my $word_count = 0;
        use locale;
        foreach my $line (@_) {
          $word_count += () = $line =~ m/\b\w+\b/g;
        }
        return $word_count;
    }
    (un peu plus robuste, le programme initial compte 1 mot en trop s'il y a un espace en début de ligne, un peu plus rapide aussi)

    Mais pour en revenir au programme initial, on en revient au concept de "contexte", qui est vital à la compréhension du Perl.
    Ici @motsdansligne est utilisé en contexte scalaire numérique (à cause du +), or un tableau en contexte scalaire numérique retourne son nombre d'éléments, d'où le résultat.

    --
    Jedaï

  4. #4
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Le problème, Jedai, c'est qu'apparemment il veut exclure les chiffres des mots, aussi. Or \w comprend les chiffres (en revanche, le "_" semble permis). Du coup, c'est un peu moins simple pour la regex (tant qu'il n'y a pas d'opérations ensemblistes sur classes dans le dialecte de Perl).
    J'ai beau chercher, je ne vois rien de moins simple que m/(?<![a-z_])([a-z_]+)(?![a-z_])/gi pour la regex. Du coup, vaudrait mieux la compiler.

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu oublies les caractères accentués, de plus il n'y a aucune variable dans la regex, elle est donc compilée automatiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub word_count {
        my $word_count = 0;
        use locale;
        foreach my $line (@_) {
          $word_count += () = $line =~ m/(?<![^\W0-9])[^\W0-9]+(?![^\W0-9])/g;
        }
        return $word_count;
    }
    Ca reste 14 % plus rapide que l'ancienne méthode (chez moi) et nettement plus robuste.

    --
    Jedaï

Discussions similaires

  1. [XL-2000] compteur et condition pour sélectionner les cases d'un tableau
    Par Rrrroh dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/08/2010, 20h04
  2. un compteur dans un tableau
    Par abdou karim diagne dans le forum C
    Réponses: 2
    Dernier message: 08/05/2007, 00h56
  3. Tableau et compteur
    Par ghisdev91 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/03/2007, 23h40
  4. vérifier si un scalaire est dans une un tableau
    Par STEPH69000 dans le forum Langage
    Réponses: 6
    Dernier message: 04/06/2006, 17h48
  5. Réponses: 7
    Dernier message: 15/02/2006, 09h58

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