17

C ++では、次のようにします。

void some_func(const char *str, ...);
some_func("hi %s u r %d", "n00b", 420);

PHPでは、次のようにします。

function some_func()
{
    $args = func_get_args();
}
some_func($holy, $moly, $guacomole);

Perlでそれを行うにはどうすればよいですか?

sub wut {
    # What goes here?
}
4

1 に答える 1

32

あなたはするでしょう:

sub wut {
  my @args = @_;
  ...
}

@_関数を呼び出すと、Perlは自動的に特別な変数を設定します。複数の方法でアクセスできます。

  • 直接、@_またはその中の個々の要素を、、などとして$_[0]使用すること$_[1]によって
  • 上に示すように、それを別の配列に割り当てることによって
  • それをスカラーのリスト(またはハッシュ、別の配列、またはそれらの組み合わせ)に割り当てることによって:

    sub wut {
      my($ arg1、$ arg2、$ arg3、@ others)= @_;
      ..。
    }

この形式では、配列@othersを最後に配置する必要があることに注意してください。前に配置すると、のすべての要素が丸呑みになるためです@_。言い換えれば、これは機能しません:

sub wut {
  my ( $arg1, @others, $arg2 ) = @_;
  ...
}

shiftから値を引き出すために使用することもできます@_

sub wut {
  my $arg1 = shift;
  my $arg2 = shift;
  my @others = @_;
  ...
}

引数を指定しない場合は、shift自動的に機能することに注意してください。@_

編集:ハッシュまたはハッシュ参照を使用して、名前付き引数を使用することもできます。たとえば、次のように電話したwut()場合:

wut($arg1, { option1 => 'hello', option2 => 'goodbye' });

...次に、次のようなことを行うことができます。

sub wut {
  my $arg1 = shift;
  my $opts = shift;
  my $option1 = $opts->{option1} || "default";
  my $option2 = $opts->{option2} || "default2";
  ...
}

これは、名前付きパラメーターを関数に導入するための良い方法です。これにより、後でパラメーターを追加でき、パラメーターが渡される順序を気にする必要がなくなります。

于 2011-04-19T16:00:03.580 に答える