Подтвердить что ты не робот

Как получить доступ к параметрам функции в Perl?

В С++ я бы сделал что-то вроде этого:

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?
}
4b9b3361

Ответ 1

Вы бы сделали:

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";
  ...
}

Это будет хороший способ ввести именованные параметры в ваши функции, чтобы впоследствии вы могли добавлять параметры, и вам не нужно беспокоиться о том, в каком порядке они передаются.