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