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 :

Message d'erreur hash vs map


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Message d'erreur hash vs map
    Bonjour,

    Je me tourne vers vous car j'ai un probleme que je n'arrive pas a résoudre.

    Je parse une table de routage et je range les différents info dans un hash et a chaque fois perl n'est pas content il veut "map" mais je vois pas trop comment faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (@sh_route) {
            chomp $_;
            if ( $_ =~ /Gateway of last resort is\s+(\d+\.\d+\.\d+\.\d+)/) { $result->{gateway} = $1 } ;
            if ( $_ =~ /^\s*(\w+\*?)?\s+([\d\.]+.*)/) {
                $result->{route}->{$i}->{type}  = $1;
                $result->{route}->{$i}->{desc}  = $2;
                $i++;
            }
    }
    j'ai le message : "Cannot encode 'route' element as 'hash'. Will be encoded as 'map' instead"

    Pourriez vous m’éclairer ?

    par avance merci

  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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    C'est curieux. A vue de nez, ça devrait marcher. Je ne peux pas vraiment tester sans données en entrée, mais je ne vois pas d'où peut venir ce message d'erreur; ni même ce qu'il veut dire dans ce contexte.

    En tous cas, l'affectation de hachage marche pour moi (test sous le debugger):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      DB<1> $i = 5;
     
      DB<2> $result->{route}->{$i}->{desc}  = "toto";
     
      DB<3> x \$result
    0  REF(0x600501820)
       -> HASH(0x6004b50e8)
             'route' => HASH(0x6005017a8)
                5 => HASH(0x600501718)
                   'desc' => 'toto'
    Comment as-tu déclaré la variable result?

    Utilises-tu bien use strict; et use warnings;? Sinon, fais-le, tu auras peut-être une erreur ou un warning complémentaire aidant à la compréhension du problème. Essaie d'ajouter use diagnostics;, le message sera peut-être plus explicite.

    Il y aurait quelques petites choses à simplifier dans ton code, mais on verra ça plus tard, ce n'est pas l'objet de ta question.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    tout d’abord merci pour ce retour.

    Oui, je confirme ça marche quand même en hash malgré le message d’erreur, mais pour chaque règle ça affiche le message d’erreur et vu que ce sont des tables énormes, ça rend les logs d’exploitation inutilisable et le fichier de log devient lui aussi énorme très/trop rapidement.
    Comme Perl semble indiquer que l’utilisation de « map » serait plus approprié, je cherche une solution.

    Le code de la fonction avec la déclaration de $result
    La fonction est dans un *.pm et est appelé via du SOAP depuis une IHM web.
    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
     
        my ($cnx) = @_;
        my $result;
     
        #   Commandes : - show ip route
        my @sh_route = split(/\n/, $cnx->remoteCMD("show ip route"));
     
        my $i=0;
        foreach (@sh_route) {
            chomp $_;
            if ( $_ =~ /Gateway of last resort is\s+(\d+\.\d+\.\d+\.\d+)/) { $result->{gateway} = $1 } ;
            if ( $_ =~ /^\s*(\w+\*?)?\s+([\d\.]+.*)/) {
                $result->{route}->{$i}->{type}  = $1;
                $result->{route}->{$i}->{desc}  = $2;
                $i++;
            }
        }
     
     return $result ;
    oui j’utilise use strict; et use warnings;
    pas plus de log avec use diagnostics;

    Comme me le demande Perl j’essaie d’utiliser « map » j’ai suivi des tuto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @test = map ( {$_ =~ /^\s*(\w+\*?)?\s+([\d\.]+.*)/} @sh_route) ;
     
    ou 
     
    my @type = map ( {$_ =~ /^\s*(\w+\*?)?\s+[\d\.]+.*/} @sh_route) ;
    my @desc = map ( {$_ =~ /^\s*\w+\*??\s+([\d\.]+.*)/} @sh_route) ;

    mais dela a arriver au même agencement qu'attend le front....,

    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Hum, j'avoue que je ne comprends pas... Je n'ai jamais vu ce message, me semble-t-il.

    J'aurais tendance à penser qu'il vient d'un module que tu utilises et non du core Perl. Quels modules utilises-tu dans ton programme?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Comme labrary j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    use SOAP::Transport::HTTP;
    use POSIX qw(strftime);
    use POSIX qw(floor);
    use strict;
    use warnings;
    use Date::Parse;
    use Benchmark;
    use Net::Telnet;
    et es que vous voyez comment utiliser "map" dans ce genre de cas ?

    Je comprends bien que "map" applique a l'ensemble d'un tableau une action, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @newTab = map ( {$_, chomp} @sh_route) ;
    mais je vois pas comment l'utiliser pour faire une regex et recuperer $1, $2 etc...

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Un petit exemple pour tenter d'illustrer :
    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
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use feature 'say';
     
    my @array;
     
    while ( <DATA> ) {
        chomp;
        push @array, $_;
    }
     
    say join "\n",
                 map { '"' . $_ . '"' }
                 map { $_ =~ /^(\d\d);(\w\w)_(\d\d)_(\w\w)/ ; $_ = $1 . $2 . $3 . $4 ; $_ }
                 @array;
    __DATA__
    01;aa_01_aa
    02;aa_02_aa
    03;bb_01_bb
    04;bb_02_bb
    05;bb_01_bb
    06;bb_02_bb
    sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    "01aa01aa"
    "02aa02aa"
    "03bb01bb"
    "04bb02bb"
    "05bb01bb"
    "06bb02bb"
    Après avoir chargé le tableau @array, un premier map extrait 4 éléments de chaque enregistrement et les renvoie contacténés, un second map entoure chaque élément retourné par des doubles quotes, et le tout est passé à join pour insérer un saut de ligne entre chaque élément.

  7. #7
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonsoir ptonnerre,

    ton code est tout-à-fait correct, mais on peut le simplifier, ou du moins le rendre nettement plus concis:

    Par exemple, la déclaration du tableau @array et la boucle while peuvent se réécrire en une seule ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @array = map { chomp; $_}  <DATA>;
    De même, la construction say ... join ... map ... map peut se réécrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    say join "\n",
                 map { /^(\d\d);(\w\w)_(\d\d)_(\w\w)/ ; '"' . "$1$2$3$4" . '"' }
                 @array;
    Ou même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    say map { /^(\d\d);(\w\w)_(\d\d)_(\w\w)/ ; '"' . "$1$2$3$4" . qq/"\n/ } @array;
    On peut même supprimer le tableau temporaire @array et faire toutes les opérations (hormis les pragmas) en une seule ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use feature 'say';
     
    say for map { chomp; /^(\d\d);(\w\w)_(\d\d)_(\w\w)/ ; '"' . "$1$2$3$4" . '"'} <DATA>;
    __DATA__
    01;aa_01_aa
    02;aa_02_aa
    03;bb_01_bb
    04;bb_02_bb
    05;bb_01_bb
    06;bb_02_bb
    On peut encore simplifier le map avec des substitutions comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    say for map { s/[\s;_]//g; '"' . $_ . '"'} <DATA>;
    Ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    say for map { s/[\s;_]//g; "\"$_\""} <DATA>;
    Mais je ne suis pas sûr du tout que ça réponde à la question de Falk3n, car le message d'erreur obtenu ("Cannot encode 'route' element as 'hash'. Will be encoded as 'map' instead") ne me semble pas correspondre à l'utilisation de la fonction map, mais plutôt à une structure de données appelée "map" probablement mise en oeuvre par l'un des modules utilisés, mais je ne sais pas trop lequel pour l'instant.

    @Falk3n: le warning que tu obtiens ne me paraît pas venir du code que tu nous as montré, mais d'ailleurs dans ton code..

  8. #8
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je pense que le message de warning est probablement dû au framework SOAP (ton module SOAP::Transport::HTTP, ou plus vraisemblablement l'un de ceux utilisés, directement ou indirectement, par celui-ci). Mais je n'ai pas le temps (en tous cas, pas là tout de suite) de dérouler la pelote des dépendances de ce module, car je n'utilise pas ce framework et, donc, ne le connais pas vraiment.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,

    Une piste sur le problème: cela semble être le framework soap:
    Par exemple, dans SOAP::Lite.pm il y a la fonction suivante:
    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
    sub encode_hash {
        my($self, $hash, $name, $type, $attr) = @_;
     
        if ($self->autotype && grep {!/$SOAP::Constants::ELMASK/o} keys %$hash) {
            warn qq!Cannot encode @{[$name ? "'$name'" : 'unnamed']} element as 'hash'. Will be encoded as 'map' instead\n! if $^W;
            return $self->as_map($hash, $name || gen_name, $type, $attr);
        }
     
        $type = 'SOAPStruct'
            if $self->autotype && !defined($type) && exists $self->maptype->{SOAPStruct};
        return [$name || gen_name,
              $self->autotype ? {'xsi:type' => $self->maptypetouri($type), %$attr} : { %$attr },
              [map {$self->encode_object($hash->{$_}, $_)} keys %$hash],
              $self->gen_id($hash)
        ];
    }
    Avec le fameux message d'erreur.

    PS: Pas vu le dernier message de lolo78... ça m'apprendra à oublier de valider avant de me coucher
    Cordialement.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonsoir ptonnerre,

    @Falk3n: le warning que tu obtiens ne me paraît pas venir du code que tu nous as montré, mais d'ailleurs dans ton code..
    si je commente mon foreach je n'ai plus le message d'erreur.
    c'est pour ça que je suis partie sur cette piste.

  11. #11
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Comme le propose disedorgue, le message est probablement émis par le framework SOAP::...
    Le message est trompeur, je suspecte que la notion de 'map' à laquelle il fait référence est en fait un concept interne à SOAP (comme 'vector') et n'a rien à voir avec l'opérateur map de Perl.

    Citation Envoyé par Falk3n Voir le message
    si je commente mon foreach je n'ai plus le message d'erreur.
    Il y a donc clairement quelque chose dans ton foreach qui fait des interférences avec des définitions de la framework SOAP.

    Je n'ai pas creusé mais essaie peut-être de remplacer les clés littérales dans ton hash par des chaines de caractères plutôt que des barewords (si ça se trouve route est une fonction, ou un type surchargé, ou ...), par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result->{"route"}->{$i}->{"type"}  = $1;
    que tu peux incidemment écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result->{"route"}{$i}{"type"}  = $1;
    Si ca ne marche pas essaie de lancer ton script sous debugger en mettant un point d'arrêt sur "warn" (en supposant qu'il n'y a pas des milliers d'utilisations légitimes de warn avant l'émission du message en question), puis inspecte la pile d'exécution au moment ou le message est émis...
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  12. #12
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    Si ca ne marche pas essaie de lancer ton script sous debugger en mettant un point d'arrêt sur "warn" (en supposant qu'il n'y a pas des milliers d'utilisations légitimes de warn avant l'émission du message en question), puis inspecte la pile d'exécution au moment ou le message est émis...
    Pour visualiser la pile d'exécution sur un warn ou un die tu peux aussi utiliser le module Carp::Always, par exemple via l'option -M lors de l'invocation de perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ perl -E 'sub foo { warn "oops!" } sub bar { foo } sub baz { bar }; baz'
    oops! at -e line 1.
    $ perl -MCarp::Always -E 'sub foo { warn "oops!" } sub bar { foo } sub baz { bar }; baz'
    oops! at -e line 1.
    	main::foo() called at -e line 1
    	main::bar() called at -e line 1
    	main::baz() called at -e line 1
    $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    Je n'ai pas creusé mais essaie peut-être de remplacer les clés littérales dans ton hash par des chaines de caractères plutôt que des barewords (si ça se trouve route est une fonction, ou un type surchargé, ou ...), par exemple
    En faite "route" c'est juste un exemple car ca le fait pour tout ....et la c'est le drame...

    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
    2018-12-13 14:28:36 : Cannot encode 'reboot' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'ifOutBrocastPkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'negociate' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'etherStatsOctets' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'ifInOctets' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'etherStatsOversizePkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'etherStatsFragments' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'dot1dTpPortInDiscards' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'etherStatsCollisions' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'ifInMulticastPkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'ifInUcastPkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'name' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'dot3InPauseFrames' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'ifOutMulticastPkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'dot3OutPauseFrames' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'ifOutOctets' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'etherStatsMcastPkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'etherStatsJabbers' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'outOampduPkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'etherStatsPkts64Octets' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'inOampduPkts' element as 'hash'. Will be encoded as 'map' instead
    2018-12-13 14:28:36 : Cannot encode 'state' element as 'hash'. Will be encoded as 'map' instead
    j'ai essaye en enlevant "->" mais ca change rien

  14. #14
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Falk3n Voir le message
    j'ai essaye en enlevant "->" mais ca change rien
    Ca c'est juste un détail d'écriture. L'important c'est de remplacer $result->{route}... par $result->{"route"}... dans le fragment de code que tu avais donné.

    As-tu essayé avec Carp::Always ?
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  15. #15
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Concernant Carp::Always, sachant que tu appelles ton module via une interface IHM j'imagine que tu ne sais pas comment l'invoquer. Alternativement tu peux peut-être essayer la manip qui suit.

    Supposons que le warning en question soit émis par Soap::Lite::encode_hash, ce qui semble probable. Le problème est de comprendre pourquoi cette fonction est invoquée dans ton fragment de code. Une méthode désespérée, sale mais parfois efficace, consiste à insérer dans ton .pm, après les déclarations 'use ...', le code suivant :

    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
    package Soap::Lite {
    use Carp;
    sub encode_hash {
        my($self, $hash, $name, $type, $attr) = @_;
     
        if ($self->autotype && grep {!/$SOAP::Constants::ELMASK/o} keys %$hash) {
            Carp::cluck qq!Cannot encode @{[$name ? "'$name'" : 'unnamed']} element as 'hash'. Will be encoded as 'map' instead\n! if $^W;
            return $self->as_map($hash, $name || gen_name, $type, $attr);
        }
     
        $type = 'SOAPStruct'
            if $self->autotype && !defined($type) && exists $self->maptype->{SOAPStruct};
        return [$name || gen_name,
              $self->autotype ? {'xsi:type' => $self->maptypetouri($type), %$attr} : { %$attr },
              [map {$self->encode_object($hash->{$_}, $_)} keys %$hash],
              $self->gen_id($hash)
        ];
    }
    };
    Au chargement de ton .pm, cela va remplacer la définition existante de Soap::Lite::encode_hash par celle ci-dessus (extraite de Soap::Lite version 1.27) dans laquelle l'appel à warn est remplacé par un appel à Carp::cluck, qui va faire comme warn en ajoutant la pile d'invocation. Cela va permettre d'identifier comment et pourquoi cette fonction est invoquée par ton fragment de code. A l'exécution, tu devrais avoir un warning t'indiquant que la fonction a été redéfinie, ce qui est normal, mais également plus de détails dans ton log...
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    Ca c'est juste un détail d'écriture. L'important c'est de remplacer $result->{route}... par $result->{"route"}... dans le fragment de code que tu avais donné.

    As-tu essayé avec Carp::Always ?
    oups effectivement j'avais pas vu les "", je viens de tester ca change rien.

    pour ton second message, tu lis dans mes pensées
    merci pour l'explication, je vais voir si je peux tester ca.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    j'ai mis ton code ca affiche effectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    09:19:25 : Subroutine encode_hash redefined  at toto line 14.
    mais rien de plus

  18. #18
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Falk3n Voir le message
    Bonjour,

    j'ai mis ton code ca affiche effectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    09:19:25 : Subroutine encode_hash redefined  at toto line 14.
    mais rien de plus
    Hmmm. J'imagine que ton interface IHM doit effectuer ses propres remplacements de warn et die. Essaie la version ci-dessous

    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
    package Soap::Lite {
    use Carp;
    sub encode_hash {
        my($self, $hash, $name, $type, $attr) = @_;
     
        if ($self->autotype && grep {!/$SOAP::Constants::ELMASK/o} keys %$hash) {
            $^W && warn ">>> $_" for split /\r?\n/, Carp::longmess(qq!Cannot encode @{[$name ? "'$name'" : 'unnamed']} element as 'hash'. Will be encoded as 'map' instead\n!);
            return $self->as_map($hash, $name || gen_name, $type, $attr);
        }
     
        $type = 'SOAPStruct'
            if $self->autotype && !defined($type) && exists $self->maptype->{SOAPStruct};
        return [$name || gen_name,
              $self->autotype ? {'xsi:type' => $self->maptypetouri($type), %$attr} : { %$attr },
              [map {$self->encode_object($hash->{$_}, $_)} keys %$hash],
              $self->gen_id($hash)
        ];
    }
    };
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

Discussions similaires

  1. [Mapping] Message d'erreur Mapping OneToOne
    Par FooBayo dans le forum Hibernate
    Réponses: 5
    Dernier message: 19/10/2016, 07h25
  2. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  3. Réponses: 4
    Dernier message: 04/03/2003, 01h05
  4. [CR] Message d'erreur
    Par nono1 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/09/2002, 14h54
  5. Réponses: 2
    Dernier message: 27/05/2002, 19h46

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