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

  FORUM HardWare.fr
  Programmation
  Perl

  Retourner plusieurs résultats d'une fonction

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Retourner plusieurs résultats d'une fonction

n°255947
fouane
Posté le 28-11-2002 à 10:57:21  profilanswer
 

Salut je recherche comment récupérer plusieurs résulats retournés par une même fonction.
Exemple :
sub ma_fonction
{
#traitements
 
return ($valeur1, $valeur2);
}
 
puis  
 
($val1, $val2) = &ma_fonction;
 
c'est un peu comme en PHP.
 
Merci.


Message édité par fouane le 28-11-2002 à 11:00:10
mood
Publicité
Posté le 28-11-2002 à 10:57:21  profilanswer
 

n°256038
Aricoh
gentil mais fo po pousser
Posté le 28-11-2002 à 12:25:18  profilanswer
 

fouane a écrit a écrit :

Salut je recherche comment récupérer plusieurs résulats retournés par une même fonction.



 
Ton exemple était parfait, mais tout dépend des situations et surtout de ce que tu dois retourner.
 
1) retourner des scalaires uniquement
Là, no problemo

Code :
  1. sub Fonction {
  2.     ....
  3.     return($a,$b,$c,$d);
  4. }
  5. ($var1, $var2, $var3, $var4) = Fonction();


 
2) retourner un tableau unique
idem, pas de soucis

Code :
  1. sub Fonction {
  2.     ....
  3.     return(@a);
  4. }
  5. (@tableau) = Fonction();


 
3) retourner un hash unique (ou tableau associatif)
toujours no soucy !

Code :
  1. sub Fonction {
  2.     ....
  3.     return(%a);
  4. }
  5. (%hash) = Fonction();


 
4) retourner des valeurs de différents types
Là, ça se complique (tu penses bien)  :D  
 
Par exemple, tu veux retourner 2 hash ou 2 tableaux, ça pose problème car lorsque la fonction va te renvoyer les 2 hash ou les 2 tableaux, elle va le faire en te retournant TOUTES les valeurs sous forme d'un tableau unique. Ainsi, l'exemple suivant :

Code :
  1. sub Fonction {
  2.     ....
  3.     return(@a, @b);
  4. }
  5. (@tableau1, @tableau2) = Fonction();


Le résultat risque de ne pas te plaire  :heink: , explications :
La fonction retourne 2 tableaux, @a et @b, mais elle te les retournent sous UN SEUL tableau. Ce qui fait qu'à l'arrivée, @tableau1 récupère le contenu INTEGRAL de @a et @b, tu m'suis ou t'es paumé ?  :)
 
Le phénomène est identique avec les hash qui ne sont en fait "que de simples" tableaux améliorés. Si ta fonction retourne 2 hash dans 2 hash, c'est un seul hash (contenant les 2) qui sera réellement renvoyé, tu te retrouveras donc avec un premier hash contenant des infos en trop et le second qui sera vide.
 
Pour éviter ces phénomènes, tu peux employer les références (ou pointeur en C).
 
Allez zou, un petit cas concrêt : Comment initialiser un scalaire, un tableau et un hash dans une fonction et en un seul traitement :

Code :
  1. use strict;
  2. sub Initialisation {
  3.     my ($Scalaire, $Tableau, $Hash) = @_;
  4.     # initialisation du scalaire :
  5.     $$Scalaire = 1;    # note bien le $$
  6.     # initialisation du tableau (10 éléments) :
  7.     for (my $i = 0; $i < 10; ++i) {
  8.         $Tableau->[$i] = 1;
  9.     }
  10.     # initialisation du hash (10 paires clé/valeur) :
  11.     for (my $i = 1; $i < 11; ++i) {
  12.         $Hash->{$i} = 1;
  13.     }
  14. }
  15. my $toto;
  16. my @titi;
  17. my %tata;
  18. Initialisation(\$toto, \@titi, \%tata);


En sortie de la fonction Initialisation, $toto contient "1", le tableau @titi contient 10 éléments valant chacun "1" et le hash %tata contient 10 clés (de 1 à 10) contenant chacune "1".
 
As-tu saisi le truc ou bien souhaite-tu que j'approfondisse ?


Message édité par Aricoh le 28-11-2002 à 12:25:45

---------------
j'suis l'Duc des 7 Enfers Éternels ...
n°256063
Aricoh
gentil mais fo po pousser
Posté le 28-11-2002 à 12:53:38  profilanswer
 

Qq explications :

Code :
  1. Initialisation(\$toto, \@titi, \%tata);


le "\" devant chaque variable signifie que tu n'envoies pas une copie du contenu de ces variables à ta fonction mais que tu envoies l'adresse mémoire de ces variables, ce qui te permet donc de les modifier directement au sein de la-dite fonction sans passer par un quelconque return.
 

Code :
  1. my ($Scalaire, $Tableau, $Hash) = @_;


$Scalaire, $Tableau et $Hash sont des références (ou pointeurs) aux 3 variables que tu transmets en paramètres à la fonction. Ne surtout pas oublier les ( ) !!!
 

Code :
  1. $$Scalaire = 1;


$Scalaire pointe en fait sur ton scalaire. Le fait d'employer d'employer cette syntaxe avec $$ signifie que la valeur pointée par $Scalaire contient désormais 1. Si tu fais :

Code :
  1. $Scalaire = 1;

ça n'est pas bon car c'est la variable $Scalaire dans ta fonction qui contient 1, mais elle ne pointe plus sur ton scalaire hors de la fonction.
 

Code :
  1. $Tableau->[$i] = 1;


Là encore, $Tableau est un pointeur mais cette fois sur un tableau. Respecte bien cette syntaxe pour dire que "l'élément $i du tableau contient 1". Note au passage que l'on retrouve ici [ ] qui correspond à un indice de tableau.
 

Code :
  1. $Hash->{$i} = 1;


$Hash est tjs un pointeur mais ici sur un Hash. Note également ici les {} qui rappelent que l'on parle d'une association clé/valeur.
 
 


---------------
j'suis l'Duc des 7 Enfers Éternels ...
n°256130
fouane
Posté le 28-11-2002 à 14:14:23  profilanswer
 

Merci pour tes conseils.
En effet moi je voulais récupérer un tableau et 2 scalaires.
Je les récupérais comme ceci (@tab, $val, $val2) = &ma_fonction;
-Or comme tu l'as si bien expliqué, après plusieurs tests je me suis rendu compte que cela inserait les 2 scalaires à la suite du tableau.
-Pour ceci j'ai feinté en récupérant (et donc retournant) les valeurs dans cet ordre ci : ($val, $val2, @tab) = &ma_fonction;
Comme ceci il renvoie d'abord les scalaires puis le tableau et ça marche.
-Par contre quand il y aura plusieurs tableaux cette "technique du coyote" ne marchera pas.
J'essaierai avec tes explications de récupérer plusieurs tableaux mais cela à l'air d'être compliqué pout un petit cerveau comme le mien.
Merci pour ta réponse en tout cas  :hello:

n°256134
Aricoh
gentil mais fo po pousser
Posté le 28-11-2002 à 14:18:45  profilanswer
 

Pour le retour de 2 scalaires et d'un tableau, tu as procédé dans le bon ordre
 
Mais comme tu dis, lorsque tu dois retourner 2 tableaux, ou 1 tableau et 1 hash, l'affaire se complique
 
Mes explications sur les pointeurs t'ont apparemment pas bcp plu  :D  
 
Essaie tout de même, tu t'appercevras très vite que ça arrange bcp de trucs !


---------------
j'suis l'Duc des 7 Enfers Éternels ...
n°256147
fouane
Posté le 28-11-2002 à 14:35:38  profilanswer
 

C'est pas que tes explications ne m'ont pas plu mais comme je commence le perl, si je dois gérer les pointeurs dès le début de mon initiation je vais en ch... !
Mais je pense que je vais devoir m'y mettre.
Je te dirai si cela fonctionne :jap:

n°256412
Aricoh
gentil mais fo po pousser
Posté le 28-11-2002 à 18:22:33  profilanswer
 

Ok ok, mais prend le temps d'étudier un peu les références
 
Car ça n'est vraiment que du pipi d'chat à côté des expressions régulières ...
 
$a++ :D


---------------
j'suis l'Duc des 7 Enfers Éternels ...

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

  Retourner plusieurs résultats d'une fonction

 

Sujets relatifs
Fonction select ...[PHP] appel d'une fonction dans un autre fichier
Prtoection contre plusieurs lancementsfaire appel a une fonction qui se trouve dans un autre fichier !
Difference entre une procedure et une fonction ??[VB] Une fonction qui renvoie une valeur
Plusieurs style sur la meme ligne, sans retour à la ligne[PHP] Pinger une adresse DNS et retourner un gif 'online' ou 'offline'
Fonction en Shell...Compiler avec automake autoconf avec plusieurs librairies
Plus de sujets relatifs à : Retourner plusieurs résultats d'une fonction


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