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 :

alimentation d'hash en fonction de ses clés


Sujet :

Langage Perl

  1. #1
    Membre habitué Avatar de PadawanInPerl
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 462
    Points : 186
    Points
    186
    Par défaut alimentation d'hash en fonction de ses clés
    Bonjour,

    je pensais... apparemment Bêtement que :



    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
     
     
    structure conditionnelle {
     
    my $cle = $tab[1] ;
    my %h;
     
           if (exists ($h{$cle}) ) # si ma clé existe en tant que clé dans mon hash
            {
              $h_valeur = $h{$cle}; # alors j'en récupère la valeur
     
              $h_valeur += $tab[11]; # je la modifie
     
              $h{$cle} = $h_valeur; # je la réinsère à ma clé
              $h_valeur = 0;
            }
            else
            {
              $h{$cle} = $tab[11] ; # si ma clé n'existe pas dans mon hash, je crée une clé et lui attribut une valeur...
     
            }
     
     
    }

    Merci de me remettre à l'ordre ;O)
    Windows 7, 64 bit
    Perl 5.12, ActivePerl
    Python 3.2, ActivePython ( NOVICE ! )

  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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour.

    Et c'est quoi ta question?

    La seule chose qui soit manifestement fausse dans le code que tu présentes est le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    structure conditionnelle {
    (...)
    }
    qui n'est pas du code Perl, mais, ça, je pense que tu t'en doutes.

    A part cela, tu déclares un hash %h, qui est donc créé à vide, et, immédiatement après, tu testes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (exists ($h{$cle}) )
    ce test reverra forcément faux (l'élément ne peut exister, le hash vient d'être créé à vide), si bien que ton code, tel qu'il est actuellement, passera toujours dans la branche else du if.

    Maintenant, si l'on suppose le hash alimenté précédemment, je ré-écrirais le if comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (defined ($h{$cle}) )   {    
              my $h_valeur = $h{$cle}; # déclaration de la variable avec my, ce qui la rend locale au bloc
              $h_valeur += $tab[11]; 
              $h{$cle} = $h_valeur; 
              #  $h_valeur = 0; inutile
    } else {
              $h{$cle} = $tab[11] ;
    }
    ou, plus simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (defined ($h{$cle}) )   {    
              $h{$cle} += $tab[11]; # on incrémente directement la valeur contenue dans le hash
    } else {
              $h{$cle} = $tab[11] ;
    }
    Ou encore, en utilisant l'opérateur "ternaire":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $h{$cle} = defined $h{$cle} ? $h{$cle} + tab[11] : $tab[11];
    On peut même simplifier encore plus grâce au phénomène d'autovivification: si tu ajoutes un nombre à la valeur d'un hash non définie, celle-ci est créée à la volée avec une valeur 0, si bien que, dans ce cas précis, il n'y a même pas besoin de tester si le hash est défini pour cette clé. Ce qui donne ce code encore plus court:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $h{$cle} += $tab[11];
    Je ne recommande cependant pas forcément à un débutant d'utiliser cette dernière possibilité car, mal maîtrisée, elle peut conduire à des surprises. Je te conseillerais donc d'utiliser plutôt cette version:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (exists ($h{$cle}) )   {    
              $h{$cle} += $tab[11]; # on incrémente directement la valeur contenue dans le hash
    } else {
              $h{$cle} = $tab[11] ;
    }
    J'ignore si je réponds à ta question, mais comme tu n'avais pas posé de question, je ne peux faire beaucoup plus...

  3. #3
    Membre habitué Avatar de PadawanInPerl
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 462
    Points : 186
    Points
    186
    Par défaut
    Hello,

    Merci beaucoup pour ta "réponse" très complète.

    mon problème majeur était une erreur d'imbrication des conditions et de portée d'une variable.

    Ta réponse m'a rassuré et bien intéressé pour ma culture personnelle !!

    MErci encore !
    Windows 7, 64 bit
    Perl 5.12, ActivePerl
    Python 3.2, ActivePython ( NOVICE ! )

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

Discussions similaires

  1. [E-00][VBA] Créer une fonction et ses arguments
    Par tiyolx dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/07/2013, 09h43
  2. Renommer ses clés étrangères pour JPA
    Par nicorama dans le forum JPA
    Réponses: 2
    Dernier message: 09/11/2008, 09h48
  3. fonctions synchronisées mots clés ?
    Par Watier_53 dans le forum Flash
    Réponses: 1
    Dernier message: 21/04/2008, 12h21
  4. [DOM] pointer un élément en fonction de ses css
    Par cerealkiller dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 26/02/2008, 18h00
  5. [langage] hash et fonction
    Par perlaud dans le forum Langage
    Réponses: 5
    Dernier message: 21/09/2004, 19h54

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