在数组Perl中传递参数

时间:2013-01-25 13:53:23

标签: arrays perl arguments

这是我的问题:我想使用具有动态数量参数的例程。例如,这是我的潜艇:

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

我可以使用任意数量的参数调用dynamic_sub(但有些是必需的)。在我的程序中,参数的数量取决于上下文。所以我想写这样的东西:

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

dynamic_sub(@args);

问题是我无法重写dynamic_sub(),所以我必须找到一种方法将我的参数放入数组中,然后使用我的参数数组调用dynamic_sub()。当然@args应该被解释为许多参数,而不是数组;)

提前谢谢!

2 个答案:

答案 0 :(得分:4)

在Perl中,子例程采用 list 参数,这些参数在内部分配给数组@_。因此,在大多数情况下,使用数组或值列表调用sub是同样的事情。

一个例外是子程序使用原型

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 :(得分:1)

唯一可以作为参数传递的是标量列表,所以

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

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

如果sub(愚蠢地)使用原型来覆盖此行为,则可以覆盖原型使用&

&dynamic_sub(@args);