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 :

probeleme avec getopt


Sujet :

Modules Perl

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut probeleme avec getopt
    salut,

    J'utilise getopt et je ne comprends pas une chose;
    getopt est censer me renvoyer une erreur si j'appel mon script sans le parametre que je lui est preciser;

    Voila mon 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
    use strict;
    use warnings;
    use Getopt::Long;
     
    my $name = 0;
     
     
    my $result = GetOptions(
        "name=s" => \$name   
     
    );
     
     
    if ( $result == 0 ) { exit 1; }
    si j'appel mon script comme ceci
    edit.pl -n toto

    il fonctionne et je n'ai pas d'erreur
    et si je l'appel comme ceci
    edit.pl
    edit.pl -n

    mon script fonctionne alors qu'en theorie il ne devrait pas tourner

    ???

    Merci.

  2. #2
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $ perl opt.pl -n toto
    # Fonctionne, car tu as donné un argument à --name
     
    $ perl opt.pl
    # Fonctionne, car --name n'est pas un argument obligatoire
     
    $ perl opt.pl -n
    # Ne fonctione pas car --name requiert un argument
    Est-ce que ça t'éclaircit?

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    je me suis inspiré de cela sur le site de cpan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use Getopt::Long;
      my $data   = "file.dat";
      my $length = 24;
      my $verbose;
      $result = GetOptions ("length=i" => \$length,    # numeric
                            "file=s"   => \$data,      # string
                            "verbose"  => \$verbose);  # flag
    comme j'avais compris file et length avaient obligatoirement besoin d'un argument ( car "=")
    et seulement verbose etait optionnel.
    ce que tu m explique c est que tous les parametre ici n'ont pas besoin d'argument alors ?
    comment les rendre obligatoire alors ?

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    j'ai lu ça ici
    Pour cela, Getopt::Long utilise une syntaxe très simple : les arguments optionnels ajoutent un : après le nom de l'option alors que les arguments obligatoires sont spécifiés par un =. Pour préciser le type, il suffit de rajouter après le = (ou le un caractère représentant le type attendu : s pour une chaîne (string), i pour un entier (integer) ou f pour un réel (float). Voici ce que cela donne :
    et sa provient de se site
    http://articles.mongueurs.net/magazines/linuxmag49.html

  5. #5
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Le = veut dire que l'argument suivant l'option est obligatoire (soit dit en passant, les options et arguments sont deux choses différentes: les options commencent par un ou deux traits d'union et les arguments suivent une option). Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $result = GetOptions(
      "nom=s" => \$nom, # Si tu donnes --nom, tu dois obligatoirement donner un nom
      "sexe:s" => \$sexe, # Si tu donnes --sexe, tu peux omettre de le spécifier
    );
    Comme tu vois, c'est l'argument suivante l'option qui est obligatoire ou optionnel. Par contre, les deux options sont optionnelles. Voici comment tu peux te servir de ce programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ perl foo.pl
    $ perl foo.pl --name gnuvince
    $ perl foo.pl --sexe
    $ perl foo.pl --sexe male
    $ perl foo.pl --name gnuvince --sexe
    $ perl foo.pl --name gnuvince --sexe male
    Est-ce que ça t'aides?

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    ouai sa m'aide
    et donc c'est impossible d'obliger la personne à saisir -n ou --name et d'afficher un message d'erreur au cas ou elle ne le saisit pas avec getopt ?

  7. #7
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Tu peux voir si la variable à laquelle tu assignes la valeur de l'option est à undef. Je suis pas sûr s'il existe une façon directement dans Getopt::Long par contre.

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    La philosophie de GetOpt::Long est la suivante (tiré de la FAQ de la doc de GetOpt::Long) :
    GetOptions does not return a false result when an option is not supplied

    That's why they're called 'options'.
    Ce sur quoi on n'est pas forcément d'accord, mais c'est une philosophie qui est appliquée scrupuleusement par les applications Unix en ligne de commande par exemple : les options ont toujours une valeur par défaut, sinon ce ne sont pas des options, mais des arguments (autrement dit, on les mets tous seuls en fin de ligne de commande, dans la majorité des cas), et l'application fonctionne toujours si on omet de lui fournir des options.

    Sinon si tu en as vraiment besoin comme déjà suggéré, tu peux vérifier si une valeur est toujours undef après le getopt.

    Si GetOpt::Long ne te convient pas, il existe des modules de gestion des options plus sophistiqué mais il ne sont pas dans le CORE et j'ai tendance à penser que GetOpt::Long est largement suffisant dans la majorité des cas (en fait GetOpt::Std l'est sans doute aussi, mais un peu moins léché).

    --
    Jedaï

Discussions similaires

  1. probeleme avec getopt
    Par donny dans le forum Langage
    Réponses: 7
    Dernier message: 28/11/2006, 20h54
  2. j'ai un probelem avec le composant NMHTTP
    Par timsah dans le forum C++Builder
    Réponses: 2
    Dernier message: 30/01/2006, 11h26
  3. probelem avec instance SQL server 2000
    Par timsah dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 20/12/2005, 12h13
  4. probelem avec l'utilitaire "BACKUP"
    Par timsah dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 20/10/2005, 18h37
  5. [reseaux] exemple avec getopts
    Par perlaud dans le forum Programmation et administration système
    Réponses: 5
    Dernier message: 03/06/2004, 13h35

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