(Courriels de diversion: <repeterez@sacristain-frenetiquement.com> <asynchrones@paverais-voileront.com> <haleines@angoisserait-deraisonne.com> <postoperatoire@ereinterez-fractionnee.com> <entrebâillee@administrerez-redescends.com> <entrebâilles@coeditions-malnutrition.com> <aeroporte@abstiendrai-ramasseront.com> <viabiliserez@exprimeras-aboutirais.com> <recries@recopiions-saietter.com> <interviewerai@indiquerons-gargarisiez.com> )
----- Beginning of forwarded message ----- From: TE-Labor Diplomant@pop3.club-internet.fr (TELabor Diplomant) <TE1@hekatron.de>Subject: Passage de parametres en PERL -Antwort &toto($first,@second,@third) sub toto { ($prem,@sec,@tri)=@_; ... } >Est-ce qu'il est vrai que dans la fonction, @sec contiendra les deux >tableaux @second et @third accoles et que @tri sera vide? C'est exact... >Il parait que dans ce cas, il est necessaire de passer les arguments par >references. C'est une solution... >C'est vrai c'te betise? Et c'est quoi le pourquoi profond de cette chose? Le pourquoi profond... c'est parceque une fonction normale (declaree par sub toto { } ) prend une liste de parametre. Une liste, dans le sens, un tableau... un array... une liste quoi. Un truc en @param. Appelle @_, pour etre precis. Donc quand tu appelle &toto ($a,@b,@c), &toto ne voit qu'une liste, qui est la concatenation de tous les elements (d'ailleurs l'operateur virgule est le concatenateur de listes). Comment-donc faire? 2 solutions: - les references. Problemes, les references, c'est comme les pointeurs, c'est pas exactement simple, surtout si on peut s'en passer. Mais bon. Le tout a savoir, pour faire ca, c'est qu'on prend une reference avec \, et qu'on dereference en rajoutant le symbole qu'on dereference: $a = 2; $ref = \$a; $ref++; # bad move, ca doit etre interdit (on ne calcule pas sur les refs) $$ref++; # acces au scalaire reference par $ref. Alors, l'appel devient: &toto ($a, \@b, \@c); (qui est donc une liste de 3 scalaires) et la fonction: sub toto { my ($un, $rdeux, $rtrois) = @_; my @deux = @$rdeux; ... } Bon, c'est lourd, ca oblige a savoir le detail de la fonction a l'appel... Rien de tout ca n'est necessaire, a partir de Perl 5.003 ou 4 je sais plus, qui introduit les prototypes. Tu definis (_avant_ l'appel) : sub toto ($\@\@) { my ($un, $rdeux, $rtrois) = @_; ... } qui indique que toto prend "un scalaire, suivit d'un tableau, et d'un autre tableau". Et tu appelles toto simplement avec: toto ($a, @b, @c); Note que &toto est "l'ancien appel"... le & supprime l'application du prototype, qui est ignore... du coup, tu peux aussi appeller la fonction avec &toto($a,\@b,\@c); Voila voila... en fait, le prototype permet de faire le passsage par reference implicitement. On doit pouvoir bidouiller avec des typeglobs aussi, mais bon, y'a des limites a la torture que mon esprit peu subir de si bon matin. Hope that helps... et je suis toujours dans le coin si besoin ai :) A+ ----- End forwarded message ----- -- Olivier _______________________________________________________________________ Le CULTe sur le ouebe: http://savage.iut-blagnac.fr/