Что делает "@_" в Perl? - PullRequest
       11

Что делает "@_" в Perl?

8 голосов
/ 17 января 2009

Я просматривал код, написанный мною в классе Perl, и заметил это.

my ($string) = @_;
my @stringarray = split(//, $string);

Мне интересно две вещи: Первая строка, где переменная в круглых скобках, это то, что вы делаете, когда объявляете более одной переменной, и если я удалю их, она все равно будет работать правильно?

Второй вопрос: что делает @_? 1006 *

Ответы [ 4 ]

23 голосов
/ 17 января 2009

Переменная @_ - это массив, содержащий все параметры, переданные в подпрограмму.

Скобки вокруг переменной $string абсолютно необходимы. Они обозначают, что вы назначаете переменные из массива. Без них массив @_ присваивается $string в скалярном контексте, что означает, что $string будет равно количеству параметров, переданных в подпрограмму. Например:

sub foo {
  my $bar = @_;
  print $bar;
}

foo('bar');

Вывод здесь равен 1 - определенно не то, что вы ожидаете в этом случае.

В качестве альтернативы, вы можете назначить переменную $string без использования массива @_ и использования функции shift:

sub foo {
  my $bar = shift;
  print $bar;
}

Использование одного метода над другим - дело вкуса. Я задал этот самый вопрос , который вы можете проверить , если вам интересно.

12 голосов
/ 17 января 2009

Когда вы встретите специальную (или пунктуацию) переменную в Perl, посмотрите документацию perlvar . Он перечисляет их все, дает вам английский эквивалент и сообщает вам, что он делает.

10 голосов
/ 17 января 2009

Perl имеет два разных контекста, скалярный контекст и контекст списка. Массив '@_ ', если он используется в скалярном контексте, возвращает размер массива.

Итак, учитывая эти два примера, первый дает вам размер массива @_, а другой - первый элемент.

my  $string   = @_ ;
my ($string)  = @_ ;
<Ч />

В Perl есть три переменные по умолчанию $_, @_ и в зависимости от того, кого вы спрашиваете %_. Многие операции будут использовать эти переменные, если вы не дадите им переменную для работы. Единственное исключение - нет операции, которая в настоящее время по умолчанию будет использовать %_.

Например, у нас есть push, pop, shift и unshift, которые все примут массив в качестве первого параметра. Если вы не дадите им параметр, они будут использовать вместо него переменную по умолчанию. Таким образом, «shift;» совпадает с «shift @_;»

То, как были спроектированы подпрограммы, вы не могли формально сказать компилятору, какие значения вы хотите в каких переменных. Что ж, имело смысл использовать переменную массива по умолчанию @_ для хранения аргументов.

Итак, эти три подпрограммы (почти) идентичны.

sub myjoin{
  my ( $stringl, $stringr ) = @_;
  return "$stringl$stringr";
}

sub myjoin{
  my $stringl = shift;
  my $stringr = shift;
  return "$stringl$stringr";
}

sub myjoin{
  my $stringl = shift @_;
  my $stringr = shift @_;
  return "$stringl$stringr";
}

Я думаю, что первый немного быстрее двух других, потому что вы не изменяете переменную @_.

6 голосов
/ 17 января 2009

Переменная @_ - это массив (отсюда префикс @), который содержит все параметры текущей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...