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

Bioinformatique Perl Discussion :

[bioinfo] fonction getoption


Sujet :

Bioinformatique Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut [bioinfo] fonction getoption
    Salut,

    J'ai 2 questions:

    *** tout d'abord je me sers depuis un bout de tps de la fonction getoption et j'ai vu qu'on pouvais s'en servir également pour passer en ligne de commande le nom du fichier à ouvrir et nécéssaire au programme mais aussi pour écrire en ligne de commande le nom du fichier de sorti des résultats. Est-ce que quelqu'un à un exemple ou sait comment ça marche?

    *** ensuite j'aimerai pouvoir vérifier les options passéess en lignee c'est-à-dire qu'elle contiennent bien des valeurs et si elles n'en contiennent pas de mettre des valeurs par défaut.

    voici donc:
    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
     
     
    ## Fonction Getopt lit les options passées en ligne de commande (avec des raccourcis de commande)
    Getopt::Long::GetOptions('G=s' => \$GC,'GC=s' => \$GC, 'M=s' =>\$MOTIF, 'MOTIF=s' =>\$MOTIF,'A=s' =>\$AU, 'AU=s' =>\$AU, 'L=s' =>\$LENGTH, 'LENGTH=s' =>\$LENGTH,'R=s' => \$RES, 'RES=s' => \$RES, 'T=s' =>\$TRI, 'TRI=s' =>\$TRI, 'P=s' =>\$PAUSE,'PAUSE=s' =>\$PAUSE);
     
     
    ## Attribution de valeur par défaut aux options passées en ligne de ## commande dans le cas où l'utilisateur oublie de saisir les valeur
     
    if ( !( $GC =~ m/^\d+$/)) { print "GC est indefini\t";  $GC = 1; }
    if ( !( $MOTIF =~ m/^\d+$/)) { print "MOTIF est indefini\t";  $MOTIF = 1; }
    if ( !( $AU =~ m/^\d+$/)) { print "AU est indefini\t";  $AU = 1; }
    if ( !( $LENGTH =~ m/^\d+$/)) { print "LENGTH est indefini\t";  $LENGTH = 19; }
    if ( !( $RES =~ m/^\d+$/)) { print "RES est indefini\t";  $RES = 0; }
    if ( !( $TRI =~ m/^\d+$/)) { print "TRI est indefini\t";  $TRI = 0; }
    if ( !( $PAUSE =~ m/^\d+$/)) { print "PAUSE est indefini\t";  $PAUSE = 0; }
    Pour le moment, cela marche dc pas de pbl, mais j'aimerai simplement changer cette "architecture" qui me parait très redondante, on m'a dit que l'idéal serait de passer par un hash mais je ne vois pas trop comment....

    merci de lvotre aide

    perlaud

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    voici ce que j'ai fait, pour l'ouverture de fichier passé en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Getopt::Long::GetOptions('FE=S' => \'$fichier_entree, 'G=s' => \$GC,'GC=s' => \$GC, 'M=s' =>\$MOTIF, 'MOTIF=s' =>\$MOTIF,'A=s' =>\$AU, 'AU=s' =>\$AU, 'L=s' =>\$LENGTH, 'LENGTH=s' =>\$LENGTH,'R=s' => \$RES, 'RES=s' => \$RES, 'T=s' =>\$TRI, 'TRI=s' =>\$TRI, 'P=s' =>\$PAUSE,'PAUSE=s' =>\$PAUSE);
    puis un peu plus loin dans le code j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (FIC , "$fichier_entree") || die "Probleme d'ouverture: $!";
    mais ça ne marche pas et j'obtient comme message d'erreur ds le terminal

    Bareword found where operator expected at ./programme.pl line 59, near
    "'$fichier_entree, 'G" (#1)
    (S) The Perl lexer knows whether to expect a term or an operator. If it
    sees what it knows to be a term when it was expecting to see an
    operator, it gives you this warning. Usually it indicates that an
    operator or delimiter was omitted, such as a semicolon.

    (Missing operator before G?)
    syntax error at ./programme.pl.pl line 59, near "'$fichier_entree, 'G"
    Execution of ./programme.pl aborted due to compilation errors (#2)
    (F) Probably means you had a syntax error. Common reasons include:

    A keyword is misspelled.
    A semicolon is missing.
    A comma is missing.
    An opening or closing parenthesis is missing.
    An opening or closing brace is missing.
    A closing quote is missing.

    Often there will be another error message associated with the syntax
    error giving more information. (Sometimes it helps to turn on -w.)
    The error message itself often tells you where it was in the line when
    it decided to give up. Sometimes the actual error is several tokens
    before this, because Perl is good at understanding random input.
    Occasionally the line number may be misleading, and once in a blue moon
    the only way to figure out what's triggering the error is to call
    perl -c repeatedly, chopping away half the program each time to see
    if the error went away. Sort of the cybernetic version of S<20
    questions>.

    Uncaught exception from user code:
    syntax error at ./programme.pl line 59, near "'$fichier_entree, 'G"
    voici comment j'appelle le programme :
    mouche:~/Documents/dossier nom$ ./programme.pl --FE /Users/nom/Sequences/Seq -G 1 -M 1 -A 1 -L 19 -R 1 -T 1 -P 0
    je suis sûre de l'adresse du fichier d'entrée, car ça marche dans d'autre cas.

    merci

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    salut

    il faut que tu identes un peu tom code, c'est tres illisible sinon (enfin c'est peu etre juste un pb de copie colle)
    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
    Getopt::Long::GetOptions('FE=S' => \'$fichier_entree, 
                                              'G=s' => \$GC,
                                               'GC=s' => \$GC, 
                                               'M=s' =>\$MOTIF, 
                                               'MOTIF=s' =>\$MOTIF,
                                               'A=s' =>\$AU, 
                                               'AU=s' =>\$AU, 
                                               'L=s' =>\$LENGTH, 
                                               'LENGTH=s' =>\$LENGTH,
                                               'R=s' => \$RES, 
                                               'RES=s' => \$RES, 
                                               'T=s' =>\$TRI, 
                                               'TRI=s' =>\$TRI, 
                                               'P=s' =>\$PAUSE,
                                               'PAUSE=s' =>\$PAUSE);
    et ensuite lis bien la documentation du module Getopt::Long http://www.perl-gratuit.com/cgi-bin/demos/pg-perldoc.pl
    tu n'es pas oblige de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     'P=s' =>\$PAUSE,
    'PAUSE=s' =>\$PAUSE
    si il n'y a pas d'autres parametres qui commence par P, tu peux eliminer P=s' =>\$PAUSE,,le module va savoir que en mettant -P en ligne de commance c'est en fait un raccourci pour -PAUSE
    effectivement si tu avais une option -PRIMER il faudrait que tu tapes au moins -PR ou -PA pour pouvoir differencier les deux

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    j'étais déjà au courant pour:
    si il n'y a pas d'autres parametres qui commence par P, tu peux eliminer P=s' =>\$PAUSE,,le module va savoir que en mettant -P en ligne de commance c'est en fait un raccourci pour -PAUSE
    effectivement si tu avais une option -PRIMER il faudrait que tu tapes au moins -PR ou -PA pour pouvoir differencier les deux
    mais j'ai fait ça pour faire avec ou sans raccourci, mais bien sûr c'est plus simple de taper une seule lettre! je suis d'accord

    je lis la doc que tu m'as donnée et te fait signe si pbl

    merci à+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    fsapet, est-ce que tu as un exemple à me donner avec GetOption, parce que j'avoue que je ne suis ps très à l'aise avec la doc...

    merci @+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    a quoi correspond $verbose?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par perlaud
    mais j'ai fait ça pour faire avec ou sans raccourci, mais bien sûr c'est plus simple de taper une seule lettre! je suis d'accord
    Resalut
    justement je crois que tu n'as pas tres bien saisi
    avec 'PAUSE=s' =>\$PAUSE, tu peux aussi taper -P en ligne de commande et ca marchera !!
    donc dans ton code tu peux eliminer la redondance (inutile de mettre 'PAUSE=s' =>\$PAUSE ET 'P=s' =>\$PAUSE, tu mets simplement 'PAUSE=s' =>\$PAUSE et l'autre est en fait sous-entendu)


    voila
    sinon pour ta facon d'utiliser le module est bonne (indente ton code tu verras c'est plus clair a lire)
    mais ton pb est de verifier les options que les utilisateurs ont passe en ligne de commande
    donc par exemple je vois que tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( !( $GC =~ m/^\d+$/)) { print "GC est indefini\t";  $GC = 1; }
    tu cherches a verifier que l'utilisateur passe bien un nombre (\d+), c'est inutile
    en fait le module peut le faire pour toi
    tu as ce code, le s signifie que $GC doit etre une string
    si tu mets i a la place de s, le module verifiera que c'est bien un integer
    voici la liste des options dispos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    = type [ desttype ]
        The option requires an argument of the given type. Supported types are: 
     
    s
        String. An arbitrary sequence of characters. It is valid for the argument to start with - or --. 
     
    i
        Integer. An optional leading plus or minus sign, followed by a sequence of digits. 
     
    o
        Extended integer, Perl style. This can be either an optional leading plus or minus sign, followed by a sequence of digits, or an octal string (a zero, optionally followed by '0', '1', .. '7'), or a hexadecimal string (0x followed by '0' .. '9', 'a' .. 'f', case insensitive), or a binary string (0b followed by a series of '0' and '1'). 
     
    f
        Real number. For example 3.14, -6.23E24 and so on.
    ensuite je vois que tu cherches a donner une valeur par defaut si l'utilisateur se plante
    le module peut le faire a ta place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    : number [ desttype ]
        Like :i, but if the value is omitted, the number will be assigned.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    en effet je n'avais pas bien saisi pour
    justement je crois que tu n'as pas tres bien saisi
    avec 'PAUSE=s' =>\$PAUSE, tu peux aussi taper -P en ligne de commande et ca marchera !!
    donc dans ton code tu peux eliminer la redondance (inutile de mettre 'PAUSE=s' =>\$PAUSE ET 'P=s' =>\$PAUSE, tu mets simplement 'PAUSE=s' =>\$PAUSE et l'autre est en fait sous-entendu)
    mais avec tes explications, j'ai compris et en plus je l'ai lu dans la doc.

    dans la doc, j'ai lu ce que tu m'as dit:

    = type [ desttype ] et i pour integer
    donc si j'ai bien compris, j'ai juste à modifier 'PAUSE=s' =>\$PAUSE en 'PAUSE=i' =>\$PAUSE, je n'ai pas besoin d'écrire type [ desttype ]?

    et comment faire avec:

    : number [ desttype ]
    * * Like :i, but if the value is omitted, the number will be assigned.

    Encore qlq petites questions:
    ---A quoi sert $verbose? à retourner une valeur true ou false?
    ---Comment puis-je entrer en ligne de commande le path d'un fichier d'entrée et le path d'un fichier de sortie?

    merci bcp fsapet, t'es trop cool!


  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    impossible de comprendre comment marche :
    #:number [ desttype ]
    #Like :i, but if the value is omitted, the number will be assigned.





    sinon copie colle ce code dans un test.pl et lance les lignes de commande exemples
    ca devrait aller mieux ensuite (on peut faire encore plus de truc avec ce module mais je ne suis jamais aller plus loin, il existe aussi Getopt:eclare qui fait encore plus de choses mais comme j'en ai assez avecGetopt::Long;, j'en reste la )
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #!/bin/perl -w
     
    use strict;
    use diagnostics;
    use warnings;
    use Getopt::Long;
     
    my ($input_file, $output_file, $help);
    my $number = 10; #valeur par defaut, impossible de comprendre comment marche :
        #:number [ desttype ]
        #Like :i, but if the value is omitted, the number will be assigned.
     
    #EXEMPLES DE LIGNES DE COMMANDE
     
    #test.pl -i fic1 -output file2    $number prends sa valeur par defaut 10 >INPUT:fic1      OUTPUT:file2    NUMBER:10
     
    #test.pl -i fic1 -output file2 -number ppp  >Value "ppp" invalid for option number (number expected)
    #                                           >INPUT:fic1      OUTPUT:file2    NUMBER:10
     
    #test.pl -i fic1 -output file2 -n 8888   >INPUT:fic1      OUTPUT:file2    NUMBER:8888
     
    #test.pl --h
    #test.pl --help
    #test.pl -h
    #test.pl -help
     
     
    GetOptions (
    	    "input=s" => \$input_file,
    	    "output=s" => \$output_file,
    	    "number=i" => \$number,
    	    "help" =>\$help
    );
     
     
    my $usage = "
    USAGE:-i -o  [-h|--help]
     
    PARAMS :    -i              the name of input file
                -o              the name of output file
     
    OPTIONS :
                -h or --help    print this help
     
    ";
     
    if (!defined ($input_file)
       || !defined ($output_file))
      {
        print $usage;
        exit(0);
      }
     
    if ($help) {
      print $usage;
      exit(0);
    }
     
     
    print "INPUT:$input_file\tOUTPUT:$output_file\tNUMBER:$number\n";


    sinon concernant $verbose cela permet de faire des choses du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (defined ($verbose) ) {print "bienvenue dans mon script\n";}
    ainsi quand tu lances ton script celui ci est silencieux, si tu veux afficher les messages tu donnes une valeur a -v true ou -v 1 ou -verbose yes

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    Pour le moment, le code que tu m'as donné ne tourne pas sur ma machine,
    j'ai ce message d'erreur
    -bash: ./test.pl: /bin/perl: bad interpreter: No such file or directory
    je ne comprend pas car les fichiers d'entrée et de sortie existent bien, ils sont ds le même répertoire que test.pl
    j'appelle le programme avec
    ./test.pl -i Entree -output Sortie
    donc je ne sais pas d'où ça vient...mais je vais essayer de bien potasser tout ça ce WE!

    MERCI pour ton aide et je te refait signe lundi.

    @+

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    salut

    pas besoin de fichier
    c'est juste un test, je ne fais aucun traitement sur les fichiers, juste des print

    sinon fo bien entendu que tu adaptes la premiere ligne du script a ton environnement !!!

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    je ne comprends pas ce que tyu veux dire par
    pas besoin de fichier
    et par
    sinon fo bien entendu que tu adaptes la premiere ligne du script a ton environnement !!!
    ?????

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    allons allons

    reprenez vous voyons

    La première ligne est le shebang, bien connu des habitués des scripts en shell. Cette ligne (qui doit toujours être la première du fichier) indique au système d'exploitation le chemin de l'exécutable à lancer pour interpréter ce fichier. Le premier caractère doit être un dièse, ce qui a pour effet que cette ligne est considérée comme un commentaire Perl par l'interpréteur. Ensuite un point d'exclamation. Puis le chemin absolu vers l'exécutable perl (à adapter selon votre installation, voir ce que répond type perl ou which perl). Enfin les options que l'on souhaite passer à l'interpréteur.
    vu ici http://www.lhullier.org/publications...html#id2396544

    donc adapte selon ton environnement (enfin tu recopies la ligne d'un de TES scripts)


    sinon tu me dis : ""je ne comprend pas car les fichiers d'entrée et de sortie existent bien, ils sont ds le même répertoire que test.pl ""
    tu n'as pas besoin d'un quelconque fichier de sortie ou d'entree
    mon programme test.pl ne fait rien d'autre que de prendre des arguments en ligne de commande et les imprimer

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    OK, j'ai compris, merci bcp!

    je vais faire en sorte que ça tourne.

    MERCI pour tout l'aide!


    [tag resolu ajouté par Choupi]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation du getopts dans une fonction (Bash/ksh)
    Par abou33 dans le forum Shell et commandes GNU
    Réponses: 17
    Dernier message: 19/05/2015, 16h26
  2. Fonction avec getopts ne s'exécute qu'une seule fois
    Par yzoug dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 02/03/2015, 12h44
  3. problème avec la fonction getoptions
    Par Hypnocrate dans le forum Langage
    Réponses: 5
    Dernier message: 31/03/2009, 23h05
  4. Aide fonction getopt
    Par makohsarah dans le forum C
    Réponses: 12
    Dernier message: 12/06/2006, 16h02
  5. [bioinfo] fonction qui renvoie chaîne à autre fonction
    Par perlaud dans le forum Bioinformatique
    Réponses: 11
    Dernier message: 16/07/2004, 15h06

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