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

Modules Perl Discussion :

Getopt, liste d'argument assignée à une option


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 57
    Points
    57
    Par défaut Getopt, liste d'argument assignée à une option
    Bonjour,

    J'ai découvert le module Getopt qui se révèle très puissant. J'éprouve toutefois des difficultés à acceder à un champ du hachage que getopt remplit. Ce champs correspond à une option de mon programme (-e ou --select) qui peut etre appelée plusieurs fois avec plusieurs arguments.

    Ces arguments sont alors mis dans une liste qui correspond à une clé de mon hachage.

    Voici le code :

    fichier : options.pm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my %my_hash;
     
    sub my_getopt {
        GetOptions(\%my_hash,
                   "c|categories",
                   "e|select=s@",
                   "f|final",
                   "n|number",
                   "a|all") or print_usage();
        return %my_hash;
    }
    fichier : test.pl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my @tab;
    @tab = $hash{"e"};
    map { print } @tab;
    Je subodore un problème de référence...mais étant toujours débutant dans ce langage je ne les maitrise pas bien (et ce, malgré la FAQ).
    Toute explication utilisant du C pour exemple sera la bienvenue si cela peut vous aider à m'expliquer .

    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Hello, 1° petite remarque, ta méthode mygetopt a un petit problème : elle remplit une hash déclarée au niveau global sans la vider au préalable... Il vaut mieux l'écrire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub my_getopt {
        my %my_hash = ();
        GetOptions(\%my_hash,
                   "c|categories",
                   "e|select=s@",
                   "f|final",
                   "n|number",
                   "a|all") or print_usage();
        return %my_hash;
    }
    ensuite, une fois que tu as fais un appel à cette méthode, utilise le module Data:umper pour voir ce que contient ta hashmap:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %hash = &my_getopt();
    print Dumper(%hash);
    Et poste ici le résultat d'execution du programme. Ainsi, on pourra voir exactement ce que contient la hash !

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 57
    Points
    57
    Par défaut
    Bonsoir,

    Merci, j'ai donc effectué les modifications suggérées et rajouter les modules necessaires.

    fichier options.pm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sub my_getopt {
        my %my_hash = ();
     
        GetOptions(\%my_hash,
                   "c|categories",
                   "e|select=s@",
                   "f|final",
                   "n|number",
                   "a|all") or print_usage();
        return \%my_hash;
    }
    fichier test.pl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #! /usr/bin/perl
     
    use Data::Dumper;
    use strict;
    use options;
     
    my $hash = options::my_getopt();
     
    print $hash . "\n";
    my %lol = %{$hash};
    print Dumper($hash);
    L'appel du script donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [lucifer]/u/a1/varlet_s/SVN/42sh/de-gor_f-42sh/check/temp/42SH_PERL > ./test.pl --select lol1 lol2 lol3                [Last Exit: OK]
    HASH(0x8173a8c)
    $VAR1 = {
              'e' => [
                       'lol1'
                     ]
            };
    Donc à priori en faisant quelques modif j ai plus ou moins compris les références...
    Ai-je raison de penser que lorsque j effectue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $hash = options::my_getopt();
    $hash une adresse mémoire ?

    Apparemment c'est le cas, par conséquent j ai essayé de recuperer cette @?#)è! liste qui est dans ce hachage et là je bloque...

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Etant donné que tu as modifé ton code pour renvoyer une référence sur une hash

    quand tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $hash = options::my_getopt();
    $hash contient une référence sur une hash...
    pour accéder à la hash, il faut utiliser $$hash
    pour accéder à l'élément e, il faut donc faire appel à $$hash{'e'}
    et $$hash{'e'} contient une référence sur un tableau...

    du coup pour récupérer la donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $value = $$hash{'e'}[0];

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/03/2015, 21h13
  2. [Débutant] Utiliser des listes en argument d'une fonction
    Par erkenbrand dans le forum Windows Forms
    Réponses: 10
    Dernier message: 29/05/2008, 12h56
  3. getopt, plusieurs arguments a une option
    Par Tex-Twil dans le forum Linux
    Réponses: 3
    Dernier message: 03/02/2008, 20h01
  4. Réponses: 21
    Dernier message: 21/03/2007, 05h18
  5. OnMouseOver sur une option liste
    Par ok07 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/08/2006, 15h11

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