passage de paramètre à une fonction

passage de paramètre à une fonction - Perl - Programmation

Marsh Posté le 14-11-2011 à 15:14:55    

salut,
 
J'ai une fonction de ce type :

Code :
  1. sub mafonction($$%)
  2. {
  3. my ($val1,val2,%valx) = @_;
  4. }


et je souhaiterai lui ajouter un paramètre à cette fonction
 
donc j'ai fait ceci  

Code :
  1. sub mafonction($$%$)
  2. {
  3. my ($val1,val2,%valx,$newval) = @_;
  4. }


J'appel la fonction dans un script :
 

Code :
  1. mafonction( $var1, $var2, ('PRTR'=> "DEBUT" )  ,$newval);


mais j'ai cette erreur  

Citation :

Odd number of elements in hash assignment


 
pourquoi ?
est-ce impossible d'ajouter une variable après le % ?
je pourrai rajouter $newval avant %valx mais
je ne peux pas,
il y aurait trop d'impact en terme de modification.
 
merci


Message édité par donny3 le 14-11-2011 à 15:29:16
Reply

Marsh Posté le 14-11-2011 à 15:14:55   

Reply

Marsh Posté le 14-11-2011 à 23:09:36    

Citation :

est-ce impossible d'ajouter une variable après le % ?


Oui et non:  
Ce qui bloque dans ton code, c'est le
my ($val1, $val2, %valx, $newval)
Parce que ça, ça essaie de prendre 2 par 2 tout ce qui reste pour en faire un hash.
 

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. sub mafonction($$%$)
  6. {
  7.  my ($val1, $val2, $valx, $newval) = @_;
  8.  print $newval, "\n";
  9.  foreach (keys(%{$valx})) {
  10.    print "key: $_, value: ${$valx}{$_}\n";
  11.  }
  12. }
  13.  
  14. my $var1 = 1;
  15. my $var2 = 2;
  16. my $newval = 3;
  17.  
  18. mafonction $var1, $var2, {'PRTR' => "DEBUT", 'PRTR1' => "FIN"}, $newval;


 
Ça marche, mais ça génère aussi des warnings  (sub mafonction($$$$) n'en générera pas).
Noter qu'on passe un "anonymous array", comme il est d'usage dans les appels de fonctions en perl.
 
La logique du système, c'est qu'en principe, un @ ou un % ne peuvent figurer qu'en dernière position, car en principe, ils "mangent" les arguments (bon, dans la pratique, ce ne semble plus vraiment être la cas, au vu de ce que j'ai posté avec un warning).
La documentation est loin d'être claire sur le sujet (emploi de + par exemple), et ça fait partie des zones de perl qui gagneraient a avoir un bon tutorial.
 
Mais bon, le terme prototype en Perl est très trompeur: ce n'est pas vraiment une vérification de prototype mais plutôt une manière de forcer 1) le nombre d'arguments et 2) l'interprétation (scalaire, liste...) des arguments rencontrés.
 
Pour un des rares cas d'emplois utile des prototypes en Perl, cf http://www.perlmonks.org/?node_id=406231
Il vaut mieux aller voir du côté du module Params::Validate par exemple, pour une vérification (éventuellement poussée) du type des paramêtres passés à une fonction, si on en a besoin.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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