OVH Cloud OVH Cloud

Parametre liste avec un scalaire

2 réponses
Avatar
Sébastien V
Bonjour,

En cours d'apprentissage de perl je suis confronté à un comportement que je
ne comprend pas :

J'ai une fonction qui doit accepter une liste ainsi qu'un scalaire. J'ai
codé cette fonction comme ça :

sub presence {
my (@array, $item) = $_;
}

Le truc c'est que perl semble interpréter $_ comme une liste et donc associe
à @array ma liste avec le dernier élément inclus. $item se retrouve vide.

Comment faire ce genre de chose ?

Merci

Sébastien

2 réponses

Avatar
Nicolas George
"Sébastien V" wrote in message <dhbgpm$nvt$:
sub presence {
my (@array, $item) = $_;
}


D'une, les arguments d'une fonction sont dans @_, pas dans $_. De deux,
quand on écrit :

my (@list, $scalar) = <some list>;

alors @list bouffe tout ce qui est disponible, et il ne reste rien pour
$scalar. Pour faire ce que tu veux faire, cf. la doc, en particulier reftut
(il y aura des références dans l'histoire) et perlsub, la section consacrée
aux prototypes (en particulier les exemples mypop et mysplice).

Avatar
Paul Gaborit
À (at) Tue, 27 Sep 2005 15:16:32 +0200,
"Sébastien V" écrivait (wrote):
J'ai une fonction qui doit accepter une liste ainsi qu'un scalaire. J'ai
codé cette fonction comme ça :

sub presence {
my (@array, $item) = $_;
}

Le truc c'est que perl semble interpréter $_ comme une liste et donc associe
à @array ma liste avec le dernier élément inclus. $item se retrouve vide.


Normal... quoique votre code ne doit pas être celui ci-dessus mais
plutôt celui ci-dessous :

sub presence {
my (@array, $item) = @_;
}

En fait le tableau @_ reçoit tous les paramètres passés (tous les
éléments du tableau suivi du dernier argument). Ils sont tous mis à
plat.

Deux possibilités. Directe :

sub presence {
# on dépile le dernier élément
my $item = pop @_;
# on récupère la liste de tous les éléments
my @array = @_;
...
}

presence(@tab, $val);

ou en utilisant une référence :

sub presence {
my ($refarray, $item) = @_;
... # en travaillant sur $refarray->[0], $refarray->[1], etc.
... # ou sur le tableau @{$refarray}
}

presence(@tab, $val);

Dans le premier cas, le contenu du tableau @tab ne peut pas être
modifié par le fonction. Dans le second cas, on travaille directement
sur le tableau @tab.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>