Retourner plusieurs résultats d'une fonction

Retourner plusieurs résultats d'une fonction - Perl - Programmation

Marsh Posté le 28-11-2002 à 10:57:21    

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
Reply

Marsh Posté le 28-11-2002 à 10:57:21   

Reply

Marsh Posté le 28-11-2002 à 12:25:18    

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

---------------
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 28-11-2002 à 12:53:38    

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.
 
 


---------------
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 28-11-2002 à 14:14:23    

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:

Reply

Marsh Posté le 28-11-2002 à 14:18:45    

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 !


---------------
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 28-11-2002 à 14:35:38    

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:

Reply

Marsh Posté le 28-11-2002 à 18:22:33    

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


---------------
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

Sujets relatifs:

Leave a Replay

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