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 :
- sub Fonction {
- ....
- return($a,$b,$c,$d);
- }
- ($var1, $var2, $var3, $var4) = Fonction();
|
2) retourner un tableau unique
idem, pas de soucis
Code :
- sub Fonction {
- ....
- return(@a);
- }
- (@tableau) = Fonction();
|
3) retourner un hash unique (ou tableau associatif)
toujours no soucy !
Code :
- sub Fonction {
- ....
- return(%a);
- }
- (%hash) = Fonction();
|
4) retourner des valeurs de différents types
Là, ça se complique (tu penses bien)
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 :
- sub Fonction {
- ....
- return(@a, @b);
- }
- (@tableau1, @tableau2) = Fonction();
|
Le résultat risque de ne pas te plaire
, 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 :
- use strict;
- sub Initialisation {
- my ($Scalaire, $Tableau, $Hash) = @_;
- # initialisation du scalaire :
- $$Scalaire = 1; # note bien le $$
- # initialisation du tableau (10 éléments) :
- for (my $i = 0; $i < 10; ++i) {
- $Tableau->[$i] = 1;
- }
- # initialisation du hash (10 paires clé/valeur) :
- for (my $i = 1; $i < 11; ++i) {
- $Hash->{$i} = 1;
- }
- }
- my $toto;
- my @titi;
- my %tata;
- 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