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 :

Fonction calcul nombre de terme


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut Fonction calcul nombre de terme
    Bonjour à tous

    Je veux faire une simple fonction qui calcule le nombre de mots dans un fichier, j'ai fait un programme, mais il y a un problème de référence
    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
     
    #!/usr/bin/perl
    open(FIC, $ARGV[0]);
     
    while (<FIC>) {   #ici je met chaque ligne du fichier dans une case du tableau
    my $ligne=$_;
    chomp $ligne; 
     
    @a[$i]=$ligne;
     
    $i++;
     
    }
     
     
    # Appel de la fonction calcul avec un argument
    # qui est une référence pour un tableau.
    print calcul(\@a);
     
     
     
    sub calcul
    {
    my $res=0;
    my $reftab=$_;
    foreach my $c(@$reftab){  #ici on déréférence le tableau 
    print "$res";
    $res++;
    }
    return($res);
    }
    ça compile et ça rend comme résultat 0
    merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Pourquoi faire simple quand on peut faire compliqué?

    Voici un petit script uniligne qui compte le nombre de mots (en considérant que les mots sont séparés par des espaces) du fichier data.txt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -e '$a += split while <>; print "$a\n";' data.txt
    14

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut
    je peux faire simple avec un simple script, mais j'ai besoin de le faire avec une fonction.
    Je dois comprendre mon erreur

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    La principale erreur est cette ligne:

    Les arguments de la fonction sont dans le tableau @_, pas dans la variable $_. Du coup, $reftab n'est pas défini. Remplace cette ligne par la suivante:

    Ensuite, une fois cela corrigé, ton code décompte au mieux le nombre de lignes en entrée, et non le nombre de mots.

    Sinon, si tu tiens à passer par un tableau, tu peux simplifier l'alimentation de ton tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open FIC, @ARGV[0];
    @a = <FIC>;
    # @a contient maintenant toutes les lignes du fichier
    print calcul(\@a);
    ...
    Enfin, tu devrais utiliser les directives:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut
    Merci pour votre réponse
    ça marche bien maintenant j'ai juste fait:
    au lieu de encore une question j'ai pas compris l’utilité de la fonction SHIFT, car d'après ce que j'ai compris elle prend le premier élément d'un tableau, mais dans notre exemple on veut tous les éléments du tableau

    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    shift prend le premier élément du tableau passé en argument. Utilisé seul, sans argument, comme ici, dans une fonction, il prend par défaut le premier élément du tableau @_, qui contient les paramètres passés à la fonction.

    A la place de:

    Tu aurais pu écrire:

    ou

    ou encore

    cela aurait eu le même effet: dans les quatre cas, tu récupères le premier élément du tableau @_ (sauf que les deux premières syntaxes, avec shift, retirent le premier élément du tableau @_ en même temps qu'elles le lisent, alors que les deux dernières ne font que lire le premier élément sans le retirer du tableau @_, mais ça ne change rien pour ce que tu veux faire, car tu n'a plus besoin de lire ce tableau @_ ensuite).

    Shift te permet donc de récupérer le premier paramètre passé à la fonction (dans ton cas, il n'y en a qu'un seul: la référence au tableau @a que tu as alimenté précédemment).

    Cette référence te permet ensuite d'accéder au contenu du tableau @a alimenté précédemment et la déréférençant.

    Sinon, c'est une mauvaise idée que d'avoir retiré le "my". A l'exception des scripts unilignes ou programmes simple de 3 ou 4 lignes, je te conseille vraiment de déclarer toutes tes variables lexicales avec "my" et d'utiliser les instructions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    car cela permettra au compilateur de t'informer de certains bugs (par exemple, une faute de frappe sur le nom d'une variable, une valeur indéfinie, etc.) et te facilitera le travail de mise au point de ton programme.

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

Discussions similaires

  1. Fonction Calcul automatique de nombre de jours ouvrable entre deux dates
    Par KiMbOoO dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/04/2011, 09h23
  2. [WD14] Fonction Calcul Nombre possibilité
    Par mail.spam dans le forum WinDev
    Réponses: 21
    Dernier message: 26/05/2009, 11h07
  3. [Dates] Fonction calcule le nombre de demi-heures
    Par bigltnt dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2007, 15h31
  4. Réponses: 4
    Dernier message: 11/06/2006, 12h05
  5. [Optimisation][Fonction]calcul du nombre de jours ...
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/10/2005, 14h39

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