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 :

indexation d'un tableau avec une table de hachage


Sujet :

Langage Perl

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut indexation d'un tableau avec une table de hachage
    Rebonjour,

    J'ai dans mon script un tableau simple que l'on nommer "@mon_tableau"
    J'utilise pour récupérer une valeur du tableau, l'index voulu qui est contenu dans une table de hachage de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"}];
    Le souci c'est que $mon_hash{"cle1"} peut être vide (ne pas contenir de valeur numérique d'index), et donc le script me retourne une erreur:

    "Argument "" isn't numeric in array element"
    Comme mon tableau peut être très grand, cela m'ennuie de faire un if à chaque fois...

    existe-t-il donc une méthode pour pouvoir faire ça sans que le programme me retourne une erreur si $mon_hash{"cle1"} ne contient rien?

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"}] if defined $mon_hash{"cle1"};

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il est possible d'utiliser l'opérateur // (uniquement à partir de la version 5.10.0), mais dans ce cas, il faut impérativement donner une valeur numérique par défaut à l'indice recherché. Si l'on souhaite donner la valeur par défaut à 0, voici ce que cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"} // 0];

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    merci pour vos réponse!

    cependant:

    @Dimitry.e:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"}] if defined $mon_hash{"cle1"};
    => c'est à peu près ce que je voulais éviter

    @Philou67430

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"} // 0];
    C"est une idée peut être à creuser, mais dans mon cas actuel $mon_tableau[0] contient une valeur.

    Mais en y repensant cela me donne une idée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unshift(@mon_tableau, "");
    print $mon_tableau[$mon_hash{"cle1"}+1 // 0];
    Je vais essayer cela ce soir.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"}+1 // 0];
    n'aura pas l'effet voulu, car $mon_hash{"cle1"}, qui est la valeur undef, sera utilisé dans l'addition numérique avant d'être utilisé par l'opérateur //.
    Ainsi, le warning apparaitra sur l'opérateur d'addition, au lieu de l'opération d'indexation de tableau.

    Une autre idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print exists $mon_hash{"cle1"} ? $mon_tableau[$mon_hash{"cle1"}] : "";
    Autre manière de l'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print exists $mon_hash{"cle1"} && $mon_tableau[$mon_hash{"cle1"}] || "";
    Mais toutes ces écritures sont aussi lourdes que celle de dimitry, proposition de dimitry que j'aurais écrite avec exists plutôt que defined :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"}] if exists $mon_hash{"cle1"};

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Salut,

    Ma solution fonctionne bien mais mon explication n'était pas la bonne ;-)

    Dans un premier temps je complète ma table de hachage via des demandes à l'utilisateur qui donne le numéro d'index voulu (en commençant par "1" à la place de "0")

    or initialement je devais soustraire "1" pour avoir un index qui commence à zéro pour le tableau.

    mais maintenant, je ne soustrait plus le "1",

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach my $cle (keys(%mon_hash))
    {
    	print "Enter the column number of the data corresponding at $cle : ";
    	$input = <STDIN>;
    	chomp $input;
    	$mon_hash{$cle} = $input;
    }
    ensuite mon unshift, etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unshift(@mon_tableau, "");
    print $mon_tableau[$mon_hash{"cle1"} // 0];

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    OK, ça m'a l'air effectivement mieux.

    Une autre idée aurait alors été de prendre une autre valeur par défaut que l'élément 0 (celle d'un élément au delà du tableau, qui contiendrait alors undef, et serait facilement identifiable avec l'opérateur defined ou // :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $mon_tableau[$mon_hash{"cle1"} // @mon_tableau] // "Index non saisi";

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

Discussions similaires

  1. [WD15] Tableau croisé avec une table en entrée est ce possible ?
    Par Therion dans le forum WinDev
    Réponses: 2
    Dernier message: 12/03/2010, 08h15
  2. probleme avec une table de hachage
    Par sunriseprogramer dans le forum C
    Réponses: 6
    Dernier message: 24/11/2008, 11h03
  3. PROBLEME AVEC UNE TABLE INTERBASE
    Par barro dans le forum InterBase
    Réponses: 1
    Dernier message: 22/09/2004, 08h16
  4. TDBChart et liaison logicielle avec une table ?
    Par Mailgifson dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/07/2004, 14h11
  5. Probleme avec une table vide
    Par king dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/03/2004, 14h24

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