-1

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

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

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

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

dynamic_sub(@args);

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

先感谢您!

4

2 回答 2

4

在 Perl 中,子例程采用参数列表,该列表在内部分配给数组@_。因此,在大多数情况下,使用数组或值列表调用 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".
于 2013-01-25T14:22:49.830 回答
1

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

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

是一样的

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

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

&dynamic_sub(@args);
于 2013-01-25T19:25:58.027 回答