fonction avec table hash en parametre

fonction avec table hash en parametre - Perl - Programmation

Marsh Posté le 30-03-2007 à 12:40:08    

salut,
 
Je souhaite faire une fonction qui prenne en parametre un tableau hash mais je ne sais pas comment le declarer dans ma fonction ??
je sais que je l'avais fait avec un array
et j'avais mis cela pour que ma fonction prennent en parametre le tableau

Code :
  1. my @montableau= @_;


 
mais pour le hash cela ne fonctionne pas
j'ai essayer  

Code :
  1. my %montableau= %_;


 
marche pas non plus
 
Est ce que vous auriez des idée
 
Merci

Reply

Marsh Posté le 30-03-2007 à 12:40:08   

Reply

Marsh Posté le 30-03-2007 à 13:19:23    

Apprendre les bases du perl parce que là c'est nawak [:spamafote]

 

Ta syntaxe pour récupérer un tableau n'est déjà pas correcte dans la mesure tu ne récupères pas un tableau mais tous les arguments de ta fonction. Par exemple avec l'appel suivant:

Code :
  1. test(@param1, $param2)


a la récupération dans ta sub @montableau contiendra un tableau avec tous les éléments de @param1 et $param2 en dernier élément.

 

Quand on veut passer des tableaux/hash à une sub, sauf cas super particulier, on passe leur référence et on utilise celle-ci dans la fonction:

Code :
  1. sub test {
  2.   my $hRef = shift;
  3.   foreach my $key ( keys %$hRef){
  4.      print 'key:', $key, ' value:', $hRef->{$key};
  5.   }
  6. }
  7. my %hash = ('A'=>'toto', 'B'=>'tata');
  8. test(\%hash);
 

Encore une fois je pense qu'un peu de lecture de la doc/d'un bouquin ne serait pas du temps de perdu.

Message cité 2 fois
Message édité par anapajari le 30-03-2007 à 13:20:00
Reply

Marsh Posté le 30-03-2007 à 13:45:59    

anapajari a écrit :

Encore une fois je pense qu'un peu de lecture de la doc/d'un bouquin ne serait pas du temps de perdu.


+1  :sarcastic:  
 
Pour bosser via une fonction avec un hash qui lui est envoyé, comme toujours en Perl tu as plusieurs méthodes.
 
Soit une méthode simple sans références :
 

Code :
  1. use strict;
  2. my %toto = (1, "un", 2, "deux" );
  3. %toto = AjouteCleValeur(%toto);
  4. sub AjouteCleValeur
  5. {
  6.     my %pouet = @_;
  7.     $pouet{3} = "trois";
  8.     return %pouet;
  9. }


 
Soit par référence :
 

Code :
  1. use strict;
  2. my %toto = (1, "un", 2, "deux" );
  3. AjouteCleValeur(\%toto);
  4. sub AjouteCleValeur
  5. {
  6.     my ($hash) = shift();
  7.     $hash->{3} = "trois";
  8. }


 
Généralement, j'utilise la seconde méthode, plus souple lorsque l'on souhaite bosser directement dans le hash pour le modifier via la fonction appelée. Et aussi, parce que bien plus pratique lorsque la fonction reçoit scalaires, listes, hash de hash et autres bricoles plus ou moins amusantes  :D


Message édité par Aricoh le 30-03-2007 à 13:54:20

---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 30-03-2007 à 13:48:26    

anapajari a écrit :

Apprendre les bases du perl parce que là c'est nawak [:spamafote]


 
Comme disait mon prof, y a certaines notions à savoir en Perl parmi lesquelles probablement la plus importante : connaître la notion de ce qu'est un scalaire, un tableau et un hachage.
 
Quand tu sais ça, c'est déjà pas mal  :)  

Reply

Marsh Posté le 30-03-2007 à 13:52:46    

manque un my %pouet dans ta 1ere méthode ;)

Aricoh a écrit :

Comme disait mon prof, y a certaines notions à savoir en Perl parmi lesquelles probablement la plus importante : connaître la notion de ce qu'est un scalaire, un tableau et un hachage.
Quand tu sais ça, c'est déjà pas mal  :)


je suis 200% d'accord mais je rajouterais les références, sinon tu te retrouves à pas faire la différence entre ces 3 écritures:

Code :
  1. my $a = [1,2];
  2. my $b = {1,2};
  3. my $c = (1,2);

Reply

Marsh Posté le 30-03-2007 à 13:57:23    

anapajari a écrit :

manque un my %pouet dans ta 1ere méthode ;)


J'ai corrigé la boulette  :D  
 

anapajari a écrit :

je suis 200% d'accord mais je rajouterais les références, sinon tu te retrouves à pas faire la différence entre ces 3 écritures:

Code :
  1. my $a = [1,2];
  2. my $b = {1,2};
  3. my $c = (1,2);



Certes certes  :whistle: mais en disant mon truc, je pensais à la notion "B.A-baesque" en Perl. Il y a bien entendu d'autres notions à savoir mais que notre bonhomme n'aura pas le temps d'apprendre apparemment (au fait donny3, tu sais maintenant à quoi servent les fonctions print, close et open ou toujours pas ?  :D )
 

Reply

Marsh Posté le 30-03-2007 à 15:49:16    

les bases du perl je les connais Aricoh donc certaines reflexion vous pouvez les garder surtout le print;
ma question elle etait simple et j'ai eu la reponse c'etait cela

Citation :


my @montableau= @_;


 
pas besoin d'un debat la dessus;
on est pas censer tout savoir comme toi lol
à bonne entendeur
 
aricoh et anapajri vous etes un peu en contradiction
y'en a un qui me dit c'est possible avec cela

Citation :

my %pouet = @_;

et l'autre qui me donne un exemple dans lequel il utilise cela

Message cité 1 fois
Message édité par donny3 le 30-03-2007 à 16:41:18
Reply

Marsh Posté le 30-03-2007 à 16:40:27    

donny3 a écrit :

les bases du perl je les connais Aricoh donc certaines reflexion vous pouvez


C'était pas méchant hein, mais je pense que non [:roane] ...
Et de toute façon au vu des questions que tu as posté dans la cat recemment, je vais encore insisté sur le fait qu'il te manque des bases pour comprendre ce que tu dois faire et pour le faire correctement et "proprement" ( même si en perl ça veut rien dire)
Perso, j'ai toujours sous la main:

  • la doc
  • les  O'Reilly suivant "Perl in a nutshell" et "Advanced Perl Programming", et un peu plus loin "Perl Cookbook"
  • et la cpan

Et bin tu y trouves 95% des réponses/solutions [:spamafote]

Message cité 1 fois
Message édité par anapajari le 30-03-2007 à 16:41:39
Reply

Marsh Posté le 30-03-2007 à 16:42:28    

ces deux bouquins y coutent une fortune

Citation :


les deux O'Reilly "Perl in a nutshell" et "Advanced Perl Programming"
 

Reply

Marsh Posté le 30-03-2007 à 16:50:15    

Reply

Marsh Posté le 30-03-2007 à 16:50:15   

Reply

Marsh Posté le 30-03-2007 à 16:57:29    

je l'ai fait comme cela et sa fonctionne

Code :
  1. my %tab;
  2. my  $chemin1="$home...";
  3. %tab=recuperation(chemin1,%tab);
  4. sub recuperation
  5. {
  6. my $chemin=shift;
  7. my %tableau=@_;
  8. open(FILE,"< $chemin" );
  9. while(my $info=<FILE> )
  10. {
  11. if (not($info =~ /^XX/))
  12.  {
  13.  (my $champ,my $val)=split(/=/,$info);
  14.  $champ=~s/\s*$//;
  15.  $val=~s/\s*$//;
  16.  $tableau{$champ}=$val;
  17.   }
  18. }
  19. close(FILE));
  20. return %tableau;
  21. };


Message édité par donny3 le 30-03-2007 à 16:58:01
Reply

Marsh Posté le 30-03-2007 à 18:37:19    

anapajari a écrit :

C'était pas méchant hein, mais je pense que non [:roane] ...


C'était une boutade mais bon...  [:zeusy]  
 
Et sinon Donny3, cette doc GRATUITE là, tu connais ? http://perl.enstimac.fr/DocFr.html

Reply

Marsh Posté le 02-04-2007 à 08:27:45    

j'avais vu le site
mais pas fait attention à la doc
je crois que je vais faire un tour dans les boutique de livre d'occaz
et je vais m'en prendre un bien;

Reply

Marsh Posté le 02-04-2007 à 09:10:13    

Si tu dois n'en prendre qu'un, je te conseille vraiment "Advanced Perl Programming".


Message édité par anapajari le 02-04-2007 à 09:10:23
Reply

Marsh Posté le 02-04-2007 à 13:22:27    

Reply

Marsh Posté le 02-04-2007 à 13:23:43    

Reply

Marsh Posté le 03-04-2007 à 11:28:56    

je viens de lire une doc sur les reference et en gros sa signifie que dans ma fonction j'utilise un tableau qui lui va pointé sur le vrai tableau;

Code :
  1. sub test { 
  2. my $hRef = shift; 
  3. foreach my $key ( keys %$hRef)
  4. {   
  5. print 'key:', $key, ' value:', $hRef->{$key}; 
  6. }
  7. }
  8. my %hash = ('A'=>'toto', 'B'=>'tata');
  9. test(\%hash);


 
 
en faite sa signifie que $hRef est le tableau qui va pointé sur %hash(tu créer une reference quand tu appel ton  hash dans la fonction $hRef = \%hash;
;
en faisant cette boucle foreach my $key ( keys %$hRef){  
tu dereference la reference donc $hRef et du coup cela va pointé sur %$hRef %hash et tu recupere les valeurs contenu dans %hash;


Message édité par donny3 le 03-04-2007 à 11:29:52
Reply

Marsh Posté le 03-04-2007 à 12:59:53    

C'est ça en gros, sauf qu'une référence c'est un scalaire, pas un tableau.

 

Tu peux aussi faire (note bien les accolades à la place des parenthèses) :

my $hashref = {'A'=>'toto', 'B'=>'tata'};
test($hashref);


Message édité par matafan le 03-04-2007 à 13:01:10
Reply

Sujets relatifs:

Leave a Replay

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