2013-01-25 5 views
-1

Voici mon problème: Je veux utiliser une routine avec un nombre dynamique d'arguments. Par exemple, voici mon sous:Passer des arguments dans un tableau Perl

dynamic_sub($firstMandatoryArgment, "second argument", $thirdArgument); 

je peux appeler dynamic_sub avec un certain nombre d'arguments (mais certains sont obligatoires). Dans mon programme, le nombre d'arguments dépend du contexte. Donc, je veux écrire quelque chose comme ça:

my @args = ($firstMandatoryArgment, "second argument", $thirdArgument, ...); 

dynamic_sub(@args); 

La chose est que je ne peux pas réécrire dynamic_sub(), donc je dois trouver un moyen de mettre mes arguments dans un tableau, puis appelez dynamic_sub() avec mon tableau d'arguments. Bien sûr, @args doit être interprété comme autant d'arguments, et non comme un tableau;)

Merci d'avance!

+7

Vous avez * * mis vos arguments dans un tableau. Quel est le problème? – TLP

+2

Si tous les arguments sont des scalaires, il n'y a pas de problème. Si un paramètre est un tableau, vous devez faire attention lorsque vous déplacez vos arguments vers des variables locales dans la méthode. Vous pourriez alors utiliser des références. Mais quelle est votre question ?????? –

+0

Eh bien, cela fonctionne. J'ai fait une faute de frappe :( – user2011117

Répondre

4

En Perl, les sous-programmes prennent une liste d'arguments, qui est affectée en interne au tableau @_. Par conséquent, dans la plupart des cas, appeler un sous avec un tableau ou avec une liste de valeurs est la même chose.

La seule exception est lorsque le sous-programme utilise prototypes:

sub without_prototypes { say "@_" } 
sub with_prototypes ($) { say "@_" } 

my @args = 1 .. 5; 

without_prototypes(@args); # @args is used in list context, prints "1 2 3 4 5\n". 
with_prototypes(@args); # @args is used in scalar context, prints "5\n" (length). 
&with_prototypes(@args); # the & disables prototypes; prints "1 2 3 4 5\n". 
1

La seule chose qui peut être transmis comme arguments est une liste de scalaires, donc

my @args = ($firstMandatoryArgment, "second argument", $thirdArgument, ...); 
dynamic_sub(@args); 

est la même chose comme

my @args = ($firstMandatoryArgment, "second argument", $thirdArgument, ...); 
dynamic_sub($args[0], $args[1], $args[2], ...); 

Si le sous (stupidement) utilise prototypes de passer outre ce comportement, vous pouvez remplacer l'utilisation du prototype &:

&dynamic_sub(@args); 
Questions connexes