Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1860 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Recuperer variable facultative ligne de commande

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recuperer variable facultative ligne de commande

n°2125842
Super_caro​tte
Posté le 10-02-2012 à 12:31:45  profilanswer
 

Bonjour,
 
J'ai un script PERL que les utilisateurs lancent grace a une ligne de commande.
 
Afin d'améliorer ce script, je voudrai qu'ils puissent spécifié un nombre pour savoir le nombre de fork qu'ils acceptent que le systeme lance.
 
Typiquement:
Si l'utilisateur saisi:
"mon_script -start" ça lance le script avec par defaut 10 processus
"mon_script -start 20" ça lance le script avec 20 processus
 
Donc le nombre est facultatif.
 
J'ai fait des recherches et j'ai vu ce site:
http://articles.mongueurs.net/maga [...] mag49.html
Qui est bien mais je n'ai pas bien saisi comment rendre un paramètre facultatif.
 
Actuellement j'ai:
GetOptions (    
   "-start" => \$COMMANDE->{START},
   "-stop" => \$COMMANDE->{STOP},
   "-v" => \$COMMANDE->{VERBOSE},
   "-version" => \$V
   );
 
Avez vous une idée pour récupérer ce nombre facultatif (et pour le rendre facultatif avec une valeur par défaut)?
 
Merci,
Benjamin.


Message édité par Super_carotte le 10-02-2012 à 12:32:47
mood
Publicité
Posté le 10-02-2012 à 12:31:45  profilanswer
 

n°2125873
fred777888​999
Posté le 10-02-2012 à 14:51:50  profilanswer
 

Tout est dans le lien donne.
La solution la plus simple est de compter le nombre de parametres (ARGV), puis de lire ou non ton nombre de procs.
Je ne connais pas Perl, mais il y en a surement d'autres.

n°2125881
gilou
Modérateur
Modzilla
Posté le 10-02-2012 à 15:19:34  profilanswer
 

Bon, primo, utilises Getopt::Long qui est la Rolls du Getopt ;)
Un exemple:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. use Getopt::Long;
  6.  
  7. sub startcmd {
  8.  shift;
  9.  my $param = shift;
  10.  if ($param <= 0) { $param = 10;}
  11.  print $param, "\n";
  12. }
  13.  
  14. GetOptions ("-/",               #compatible with the dos style
  15.            "start:10" => \&startcmd,
  16. );


Ici, start:10 indique 1) on attends un entier, et 2, la valeur optionnelle vaudra 10
Quand on a l'option -start (ou /start par compatibilité DOS) sur la ligne de commande on appelle la routine startcmd.
La valeur associée (celle effective ou par défaut est le 2e argument d'ou le shift a vide initial)
Bon j'ai rajouté un check pour que le paramètre soit a la valeur par défaut s'il n'est pas positif.
Ensuite, c'est a toi de coder l'appel avec $COMMANDE avec ce qu'il faut, au lieu de mon print.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2125882
gilou
Modérateur
Modzilla
Posté le 10-02-2012 à 15:22:30  profilanswer
 

fred777888999 a écrit :

Tout est dans le lien donne.
La solution la plus simple est de compter le nombre de parametres (ARGV), puis de lire ou non ton nombre de procs.
Je ne connais pas Perl, mais il y en a surement d'autres.

Non, la solution la plus simple et rapide est d'utiliser comme il faut le bon module perl et de ne surtout pas réinventer la roue.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2125885
Super_caro​tte
Posté le 10-02-2012 à 15:34:29  profilanswer
 

Merci beaucoup pour ce code Gilou  :D  
 
Je viens de le tester et il réagit exactement comme je le voulai.
(et merci pour l'astuce dos  ;)  )
 
Merci encore,
Benjamin.


Message édité par Super_carotte le 10-02-2012 à 15:58:40
n°2126188
Super_caro​tte
Posté le 13-02-2012 à 11:23:54  profilanswer
 

Bonjour,
 
J'ai essayé de mettre en place ce code dans mon projet.
 
ça me donne:

Code :
  1. #!/usr/bin/perl
  2. #use lib "blabla/LIB";
  3. use strict;
  4. use warnings;
  5. use IO::Socket;
  6. use Digest::MD5;
  7. use Net::Ping;
  8. use Getopt::Long;
  9. use HeavyCAL::HeavyCAL;
  10. use HeavyCAL::HCALOthers;
  11. use HeavyCAL::HCALAction;
  12. my $VERSION = "V0.1";
  13. my $V;
  14. my $ACTION => HCALAction->new();
  15. my $COMMANDE = HeavyCAL->new();
  16. if ($#ARGV > 4)
  17. {
  18.  HCALOthers->print_message("SYNTAXE" );
  19.  exit 1;
  20. }
  21. #foreach (@ARGV) { print "AAA: $_\n" }
  22. sub startcmd_cleanP {
  23. shift;
  24. my $param = shift;
  25. if ($param <= 0) { $param = 10;}
  26. print "Nombre de fork autorises par fils: $param \n";
  27. return $COMMANDE->{CLEANP};
  28. }
  29. sub startcmd_stopP {
  30. shift;
  31. my $param = shift;
  32. if ($param <= 0) { $param = 10;}
  33. print "Nombre de fork autorises par fils: $param \n";
  34. return $COMMANDE->{STOPP};
  35. }
  36. GetOptions (
  37.   "-p=s" => \$COMMANDE->{PROJET},
  38.   "-a=s" => \$COMMANDE->{ALIAS},
  39.   "-clean" => \$COMMANDE->{CLEAN},
  40.   "-cleanP:10" => \&startcmd_cleanP,
  41.   "-start" => \$COMMANDE->{START},
  42.   "-stop" => \$COMMANDE->{STOP},
  43.   "-stopP:10" => \&startcmd_stopP,
  44.   "-startone" => \$COMMANDE->{STARTONE},
  45.   "-stopone" => \$COMMANDE->{STOPONE},
  46.   "-v" => \$COMMANDE->{VERBOSE},
  47.   "-version" => \$V
  48.   );
  49. if (defined $V)
  50. {
  51. print "HEAVYCALauncher version $VERSION\n";
  52. exit 1;
  53. }
  54. $ACTION = $COMMANDE->check_commande();
  55. $ACTION->action_check();
  56. HCALOthers->print_message("RETOUR","\n\n          ***** OPERATION COMPLETELY SUCCESFULL *****\n\n" );


 
Le probleme c'est qu'en lançant la commande:
"CAL petit_bateau -stopP"
Ou CALest le nom de mon alias
petit_bateau le nom du projet a lancer ou arrêter
 
Le code ne réagit pas comme voulu. Il me lance la commande par défaut a savoir: il affiche l’état des process (up ou down).
 
Je pense que c'est ma façon de récupérer les infos dans mon GetOptions qui pêche. notamment dans les deux fonctions "startcmd_stopP" et "startcmd_cleanP".
 
Auriez vous une piste a suivre?
 
Merci,
Benjamin.


Message édité par Super_carotte le 13-02-2012 à 11:38:32
n°2126218
gilou
Modérateur
Modzilla
Posté le 13-02-2012 à 12:17:19  profilanswer
 

Je vois pas ce qui colle pas, ceci marche parfaitement:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. use Getopt::Long;
  6.  
  7. sub startcmd {
  8.  print "StartCmd";
  9. }
  10.  
  11. sub startcmdP {
  12.  my $param = $_[1]; # équivalent de shift; my $param = $shift; en une seule ligne
  13.  $param //= 10;
  14.  if ($param <= 0) { $param = 10;}
  15.  print "StartCmdP ", $param;
  16. }
  17.  
  18. GetOptions ("-/",               #compatible with the dos style
  19.            "start" => \&startcmd,
  20.            "startP:10" => \&startcmdP,
  21. );

C:\Perl>testop.pl -start
StartCmd
C:\Perl>testop.pl -startP
StartCmdP 10
C:\Perl>testop.pl -startP 5
StartCmdP 5


Ajoute à tout hasard une ligne comme $param //= 10; (si $param est pas défini, alors $param vaut 10)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2126242
Super_caro​tte
Posté le 13-02-2012 à 14:10:40  profilanswer
 

Si, la première version fonctionne dans le sens ou elle affiche bien le nombre indiqué par l'utilisateur ou 10 par defaut.
 
Mais la ou ça coince c'est quand j'essaie de faire en sorte d'aller plus loin.
 
Pour faire simple:
Si je met mon code comme ceci:

Code :
  1. GetOptions (
  2.   "-p=s" => \$COMMANDE->{PROJET},
  3.   "-a=s" => \$COMMANDE->{ALIAS},
  4.   "-clean" => \$COMMANDE->{CLEAN},
  5.   "-cleanP" => \$COMMANDE->{CLEANP},
  6.   "-start" => \$COMMANDE->{START},
  7.   "-stop" => \$COMMANDE->{STOP},
  8.   "-stopP" => \$COMMANDE->{STOPP},
  9.   "-startone" => \$COMMANDE->{STARTONE},
  10.   "-stopone" => \$COMMANDE->{STOPONE},
  11.   "-v" => \$COMMANDE->{VERBOSE},
  12.   "-version" => \$V
  13.   );


 
ça fonctionne bien car dans un autre fichier, j'ai indiqué en dure la valeur "10".
Mais ce que je voudrai faire, c'est donner a l'utilisateur la possibilité de mettre la valeure qu'il decide.
Donc il faut que je variabilise cette valeur.
 
Donc il faut que:
1- je parvienne a récupérer la valeur indiquée par l'utilisateur: ça ton code le fait tres bien
2- que je mette cette valeur dans une variable qui puisse être utilisé plus tard dans le code.
 
Donc je pensai a quelque chose du genre:

Code :
  1. sub startcmd_cleanP {
  2. shift;
  3. my $param = shift;
  4. if ($param <= 0) { $param = 10;}
  5. our $nb_fork = $param;
  6. print "Nombre de fork autorises par fils: $param \n";
  7. return "print '$COMMANDE->{CLEANP},'";
  8. }
  9. sub startcmd_stopP {
  10. shift;
  11. my $param = shift;
  12. if ($param <= 0) { $param = 10;}
  13. our $nb_fork = $param;
  14. print "Nombre de fork autorises par fils: $param \n";
  15. return "print '$COMMANDE->{STOPP},'";
  16. }
  17. GetOptions (
  18.   "-p=s" => \$COMMANDE->{PROJET},
  19.   "-a=s" => \$COMMANDE->{ALIAS},
  20.   "-clean" => \$COMMANDE->{CLEAN},
  21.   "-cleanP:10" => \&startcmd_cleanP,
  22.   "-start" => \$COMMANDE->{START},
  23.   "-stop" => \$COMMANDE->{STOP},
  24.   "-stopP:10" => \&startcmd_stopP,
  25.   "-startone" => \$COMMANDE->{STARTONE},
  26.   "-stopone" => \$COMMANDE->{STOPONE},
  27.   "-v" => \$COMMANDE->{VERBOSE},
  28.   "-version" => \$V
  29.   );


 
Ainsi le code fonctionnerai comme indiqué dans l'exemple juste dessus grâce aux deux return des fonctions mais je serai également parvenu a récupérer la valeur indiqué par l'utilisateur dans une variable globale que j'utiliserai plus tard.
 
Or, mes return ne doivent pas retourner quelqe chose de valide car le code ne se lance pas comme dans l'exemple 1 de ce message.
 
J’espère avoir réussis a m’être fait comprendre.
 
Merci,
Benjamin.


Message édité par Super_carotte le 13-02-2012 à 14:11:32
n°2126245
gilou
Modérateur
Modzilla
Posté le 13-02-2012 à 14:21:34  profilanswer
 

OK!
C'est pas return "print '$COMMANDE->{CLEANP},'"; que tu dois faire, mais
$COMMANDE->{CLEANP};
Tout simplement, si tu veux lancer la commande.
Et pas besoin d'un return
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2126271
Super_caro​tte
Posté le 13-02-2012 à 18:02:23  profilanswer
 

En effet, merci beaucoup  :)


Message édité par Super_carotte le 13-02-2012 à 18:02:41

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Recuperer variable facultative ligne de commande

 

Sujets relatifs
Commande CMD lancé en même temps qu'une application .exe[php]Saut de ligne dans textarea
Insert into avec variable[bash] ajouter le résultat d'une commande à une ligne dans un fichier
Problèmes - Logiciel d'acquisition de tempspassage de variable issu d'un vbs lors d'un cscript
PHP hidden variable $_POST MYSQLBesoin de la traduction en clair d'une ligne de code XML
Caractere de retour a la ligne 
Plus de sujets relatifs à : Recuperer variable facultative ligne de commande


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR