Recuperer variable facultative ligne de commande

Recuperer variable facultative ligne de commande - Perl - Programmation

Marsh Posté le 10-02-2012 à 12:31:45    

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
Reply

Marsh Posté le 10-02-2012 à 12:31:45   

Reply

Marsh Posté le 10-02-2012 à 14:51:50    

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.

Reply

Marsh Posté le 10-02-2012 à 15:19:34    

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é!  --
Reply

Marsh Posté le 10-02-2012 à 15:22:30    

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é!  --
Reply

Marsh Posté le 10-02-2012 à 15:34:29    

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
Reply

Marsh Posté le 13-02-2012 à 11:23:54    

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
Reply

Marsh Posté le 13-02-2012 à 12:17:19    

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é!  --
Reply

Marsh Posté le 13-02-2012 à 14:10:40    

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
Reply

Marsh Posté le 13-02-2012 à 14:21:34    

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é!  --
Reply

Marsh Posté le 13-02-2012 à 18:02:23    

En effet, merci beaucoup  :)


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed