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 :

hash moose et reference


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Par défaut hash moose et reference
    je m'étais promis de plus vous embêter, mais il y a un truc qui me depasse (dans moose)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my @val = $self->fabrique->document->hash->{"$nom"};
    #print "val 0 ", $val[0][0];
    my $longval = @{$val[0]};
    on me repond
    Can't use an undefined value as an ARRAY reference

    donc je fais un print pour voir ce qui se passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my @val = $self->fabrique->document->hash->{"$nom"};
    print "val 0 ", $val[0][0];
    my $longval = @{$val[0]};
    et là, miracle
    ça fonctionne, plus d'erreur
    no seulement val 0 m'affiche la valeur de mes champs, mais tout le reste de l'application fonctionne ?

    je modifie
    en fait j'ai compris
    de ce cas de figure il n'y a qu'un champs par tableau et perl me prévient gentiment que la boucle for qui suivait était complètement inutile.
    excusez moi pour le dérangement.

  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
    Alors, ce qu'il me semble (mais tu n'a pas donné tous les éléments, nous ne savons pas ce qu'il y a dans $self->fabrique->document->hash->{"$nom"}):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @val = $self->fabrique->document->hash->{"$nom"};
    alimente a priori @val avec un scalaire. @val a maintenant un élément, ce qu'il y a dans ton hash de hash... de hash.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $longval = @{$val[0]};
    essaie de déréférencer $val[0], mais $val[0] n'est pas une référence vers un tableau.

    Mais quand tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "val 0 ", $val[0][0];
    tu utilises @val comme un tableau de tableaux. Du coup, il y a le phénomène d'autovification qui crée la référence vers un tableau.

    Il n'y a plus d'erreur de compilation, mais le code n'est sans doute pas juste. Dans tous les cas, je ne comprends pas ce que essaie de faire ici. Et je pense que ton code ne marchera pas si tu utilises les pragmas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Alors, ce qu'il me semble (mais tu n'a pas donné tous les éléments, nous ne savons pas ce qu'il y a dans $self->fabrique->document->hash->{"$nom"}):


    Il n'y a plus d'erreur de compilation, mais le code n'est sans doute pas juste. Dans tous les cas, je ne comprends pas ce que essaie de faire ici. Et je pense que ton code ne marchera pas si tu utilises les pragmas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    On me dit que Moose active automatiquement ces pragma
    0ui en effet il y avait une erreur dans le code (j'avais fait une modification dans mon premier post que tu n'as certainement pas vu)
    En fait j'avais adaptée une fonction que j'avais écrite pour un hash qui contenait plusieurs tableaux, mais dans ce cas il n'y avait qu'un seul tableau par hash, ce qui fait que la taille était Zero et donc undefined. D'où l'erreur. Ce qui m'a permis de supprimer la boucle for qui suivait et qui étaient inutile dans ce cas.
    Mais ça surprend qu'un print puisse modifier le comportement d'un script, et sur ce point tu m'as répondu. merci .

  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
    Tu as sans doute raison. A vérifier, mais il est probable que Moose active ces pragmas.

    Voici une séance sous le debugger Perl montrant le mécanisme d'autovivification:

    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
    $ perl -de 42
     
    Loading DB routines from perl5db.pl version 1.33
    Editor support available.
     
    Enter h or `h h' for help, or `man perldebug' for more help.
     
    main::(-e:1):   42
      DB<1> x \@a;
    0  ARRAY(0x600500b60)
         empty array
      DB<2> print $a[0][0][1][0];
     
      DB<3> x \@a;
    0  ARRAY(0x600500b60)
       0  ARRAY(0x600509958)
          0  ARRAY(0x60062ef40)
             0  empty slot
             1  ARRAY(0x6005e7e40)
                  empty array
      DB<4> q
    Je lance le programme et affiche le contenu de @a, qui est naturellement vide puisque je n'ai encore rien fait.

    Ensuite j'imprime le contenu $a[0][0][1][0] (qui est naturellement vide).

    Comme tu peux le voir quand j'affiche la seconde fois le contenu de @a, le print suffit à créer toute une structure de données (vide, mais existante).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Par défaut
    Citation Envoyé par Lolo78 Voir le message

    Comme tu peux le voir quand j'affiche la seconde fois le contenu de @a, le print suffit à créer toute une structure de données (vide, mais existante).
    j'ai compris le truc. Par contre je ne sais pas encore me servir d'un debogueur et c'est pourquoi j'emploie quantité de print pour suivre ce qui se passe. Maintenant que je sais qu'un print peut modifier le comportement de l'application ...
    Ensuite, il y a certainement un problème dans mon code, car la fonction qui exploite des hash qui contiennent plusieurs tableaux, devrait aussi fonctionner s'ils n'en contenaient qu'un seul. Mais bon, pour l'instant la question était plutôt de l'organisation du tout et de la façon dont ça va fonctionner. Dans le detail, le code est très imparfait et ne fonctionne que quand tout va bien.
    Et pour finir je mets des warnings et des strict partout dans mes codes ... Bonne soirée.

  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
    Bonsoir,

    j'ai rédigé récemment une FAQ sur le débogage en Perl (pas seulement le debugger, mais aussi les autres techniques de débogage). Je pense que ça pourrait te servir: FAQ Débogage en Perl.

    Bonne lecture et bonne soirée...

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. [langage] reference et hash complex
    Par mlo dans le forum Langage
    Réponses: 4
    Dernier message: 07/07/2004, 17h46
  3. [langage] Créé un hash dans un fichier...
    Par Smooky dans le forum Langage
    Réponses: 3
    Dernier message: 26/03/2003, 08h49
  4. Tables de hash
    Par miss8 dans le forum C
    Réponses: 2
    Dernier message: 16/11/2002, 17h44
  5. [VB6]Passage par référence d'une prop. d'objet à une fct
    Par -gYs- dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 02/09/2002, 08h55

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