-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 では、サブルーチンは配列に内部的に割り当てられる引数のリスト@_を取ります。したがって、ほとんどの場合、配列または値のリストを使用してサブルーチンを呼び出すことは同じことです。

1 つの例外は、サブルーチンがプロトタイプを使用する場合です。

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], ...);

サブが (ばかげて) プロトタイプを使用してこの動作をオーバーライドする場合、プロトタイプの use をオーバーライドできます&

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