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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du 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
    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
    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
    Membre du 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
    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
    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
    Membre du 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
    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 confirmé
    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
    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.

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