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 :

test if & defined sur un élément d'un hash


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut test if & defined sur un élément d'un hash
    Bonjour,


    Je vais chercher un élément dans une table de hash, un peu à cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $PROJETS->{$c}->{$2}->{$1}
    $c, $2, $1, correspondent à des chaines de caractères des clés du hash.

    Cet élément du hash peut être défini avec une valeur, ou non.

    Je veux tester si la valeur est définie, et traiter en conséquence en fonction du résultat.

    Le souci, c'est que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (defined ($PROJETS->{$c}->{$2}->{$1})) {
    ne me fait pas entrer dans le if, quand $PROJETS->{$c}->{$2}->{$1} est défini.

    Et même si je stocke d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $truc = $PROJETS->{$c}->{$2}->{$1};
    et que je teste ensuite :

    ca ne marche pas non plus.

    Je m'y prends mal apparemment, quel est le meilleur moyen?

    Merci beaucoup pour votre aide.

  2. #2
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Ce que tu montres devrait marcher, es-tu certain que $truc est bien défini lorsque tu ne rentres pas dans le if ? Fais un print de $truc juste avant le if pour vérifier (et utilises bien warnings et strict).

    --
    Jedaï

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    N'as-tu pas un message d'erreur?

    Dans $PROJETS->{$c}->{$2}->{$1}, $PROJETS est-il bien une référence vers ton tableau? Si c'est le tableau lui-même, tu dois supprimer la première flèche.

    Comme ça :
    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
    #!/usr/bin/perl
     
     
    use strict;
    use warnings;
     
     
    my %PROJETS;
     
    my $PROJETS_ref = \%PROJETS;
     
    $PROJETS{un}->{deux}->{trois} = 1;
     
     
    if (defined $PROJETS{un}->{deux}->{trois} ){
    	print "$PROJETS{un}->{deux}->{trois} \n";	
    }
     
    if (defined $PROJETS_ref->{un}->{deux}->{trois} ){
    	print "$PROJETS_ref->{un}->{deux}->{trois} \n";	
    }
    -- Jasmine --

  4. #4
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    Quelque chose m'échappe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my $truc = $PROJETS->{$c}->{$2}->{$1};
            print "TRUC : <$truc>\n";
     
            if (defined ($truc)){
                print "OK\n";
            }
            else {
                    print "NOK\n";
              }

    Quand j'ai une valeur non définie, j'ai :
    j'ai aussi :

    au lieu de NOK ....

    Par contre, ça marche bien quand j'ai une valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #TRUC : <VALEUR>
    #OK

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Si $PROJETS->{$c}->{$2}->{$1} est une chaîne vide alors il est défini mais quand tu fais un print tu ne vois rien (car il n'y a rien à voir).

    Comment as-tu crée ton tableau?
    -- Jasmine --

  6. #6
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    En fait, le hash est créé à partir du parsing d'un fichier XML.

    Peut-être devrais-je utiliser 'exists' ?
    Me semble que ça ne marche pas pour les éléments d'un hash ou d'un array.

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par byrdo Voir le message
    En fait, le hash est créé à partir du parsing d'un fichier XML.

    Peut-être devrais-je utiliser 'exists' ?
    Me semble que ça ne marche pas pour les éléments d'un hash ou d'un array.
    Ce que je voulais demander au sujet de la création du tableau est si il a été créé dans un premier temps avec toutes des valeurs de chaînes vides et ensuite rempli. Cela pourrait expliquer des 'valeurs vides' ( $hash{cle} = '' ). Au lieu de if( defined ...) tu peux essayer if(... ne '') mais ce n'est pas très joli.


    Exists permet de vérifier l'existence d'une clé de hash et non si la valeur associée est définie.
    -- Jasmine --

  8. #8
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Ce que je voulais demander au sujet de la création du tableau est si il a été créé dans un premier temps avec toutes des valeurs de chaînes vides et ensuite rempli. Cela pourrait expliquer des 'valeurs vides' ( $hash{cle} = '' ). Au lieu de if( defined ...) tu peux essayer if(... ne '') mais ce n'est pas très joli.


    Exists permet de vérifier l'existence d'une clé de hash et non si la valeur associée est définie.
    Tu as raison, vu la manière dont le hash est "populé", il est créé avec des valeurs de chaines vides.

  9. #9
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    J'ai utilisé un test de ce style, comme proposé par Jasmine :

    Ca suffit largement pour ce que je teste.

    Le "defined" ne marchait pas car le hash se construisait vide, avant d'être rempli progressivement.

    Un champ vide n'était donc pas conséquent indéfini.

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

Discussions similaires

  1. Test sur un élément entrant
    Par dev_lan dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 19/06/2014, 09h52
  2. Faire des tests sur les éléments de jointure
    Par yassineonline2013 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/05/2013, 10h48
  3. [XSD] comment faire des tests sur des éléments
    Par attila771 dans le forum Valider
    Réponses: 1
    Dernier message: 11/10/2007, 12h32
  4. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45

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