这是我的问题:我想使用具有动态数量参数的例程。例如,这是我的潜艇:
dynamic_sub($firstMandatoryArgment, "second argument", $thirdArgument);
我可以使用任意数量的参数调用dynamic_sub(但有些是必需的)。在我的程序中,参数的数量取决于上下文。所以我想写这样的东西:
my @args = ($firstMandatoryArgment, "second argument", $thirdArgument, ...);
dynamic_sub(@args);
问题是我无法重写dynamic_sub(),所以我必须找到一种方法将我的参数放入数组中,然后使用我的参数数组调用dynamic_sub()。当然@args应该被解释为许多参数,而不是数组;)
提前谢谢!
答案 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);