Как вы получаете доступ к параметрам функции в Perl? - PullRequest
15 голосов
/ 19 апреля 2011

В 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?
}

1 Ответ

28 голосов
/ 19 апреля 2011

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

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

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

...