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

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    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
    Points : 12 256
    Points
    12 256
    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 régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    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
    Points : 12 256
    Points
    12 256
    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 régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    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
    Points : 12 256
    Points
    12 256
    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...

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

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

    j'ai rédigé récemment une FAQ sur le débogage
    Je lirais avec attention tes articles, tout en me demandant comment on peut trouver le temps de rédiger tout ça.
    Tu m'as demandé ce qu'il avait dans de hash, j'aurais pu te répondre simplement en te donnant l'isa de la variable hash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    has 'hash' => (
    isa     => 'HashRef[ArrayRef[Str]]',
    ce qui me donne l'occasion de dire que Moose est très tatillon pour la déclaration des types. Mais que Moose est un outil fabuleux et très agréable à utiliser.
    Bonne journée.

  8. #8
    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
    Citation Envoyé par vidici Voir le message
    je m'étais promis de plus vous embêter
    Je pense que si c'était le cas, on ne te répondrait pas (mais si on ne te réponds pas, ça ne veut pas forcément dire que tu nous embêtes, hein )

    Si j'ai bien compris, et si $self->fabrique->document->hash->{"$nom"} retourne un array ref (ArrayRef au sens Moose), je dirais que tu dois récupérer le résultat ainsi :
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @val = @{$self->fabrique->document->hash->{"$nom"}};
    print $val[0];
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $val = $self->fabrique->document->hash->{"$nom"};
    print $val->[0];
    avec une préférence pour le deuxième.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Je pense que si c'était le cas, on ne te répondrait pas (mais si on ne te réponds pas, ça ne veut pas forcément dire que tu nous embêtes, hein )
    c'est sympa

    Citation Envoyé par Philou67430 Voir le message
    Si j'ai bien compris, et si $self->fabrique->document->hash->{"$nom"} retourne un array ref (ArrayRef au sens Moose), je dirais que tu dois récupérer le résultat ainsi :
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @val = @{$self->fabrique->document->hash->{"$nom"}};
    print $val[0];
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $val = $self->fabrique->document->hash->{"$nom"};
    print $val->[0];
    avec une préférence pour le deuxième.
    oui mais non c'est bien en première notation
    Alors bien sur on peut penser qu'il y a un tableau de trop, mais j'ai bien le hash structure nommée, un tableau qui contient un ou plusieurs strings.
    Je ne sais pas si c'est lié mais comme je l'ai déjà dit j'ai eu beaucoup de mal a enfoncer les hash et les tab dans Moose car ce dernier demande à être servi de façon anonyme c'est à dire avec des [@tab] et des {%hash} ... c'est peut être le pourquoi du comment, mais j'en sais rien.

  10. #10
    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
    Peut-être pourrais-tu fournir un script "de test" contenant le minimum requis pour le faire tourner et un objet Moose qui pose problème, afin que l'on puisse expérimenter (car surtout sans connaitre Moose, pas facile pour moi d'imaginer ce que retourne les fonctions que tu nous montres).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    En fait il n'y a plus vraiment de problème, c'est juste que
    dans moose
    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
     
    my @val = $self->fabrique->document->hash->{"$nom"};
     
                            if ( defined $val[0]) {
    # body...
                            my $longval = @{$val[0]};
     
                            for (my $var = 0; $var < $longval; $var++) {
                                    my $ligne = $val[0][$var];
                                    $result = $result.$ligne; 
                                    }   
                            }   
     
     
                            return $result;
                    }
    correspond à en dehors de moose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my %hash = $classe->get_hash;
    print $hash{'nom'}->[x];

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