Perl назначить ссылку на подпрограмму - PullRequest
0 голосов
/ 02 ноября 2018

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

Мой код внизу.

my @aar = (9,8,7,6,5);

my $ref = \@aar;

AAR($ref);

sub AAR {
   my $ref = @_;
   print "ref = $ref";
}

При этом будет напечатано 1, а не ссылка на массив, но если я заменю @_ на shift, результатом печати будет ссылка.

Может кто-нибудь объяснить, почему я не могу получить ссылку, используя @_ для меня?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Когда вы назначаете массив скаляру, вы получаете размер массива. Вы передаете один аргумент (ссылку на массив) в AAR, поэтому вы получаете 1.

Чтобы получить фактические параметры, поместите локальную переменную в фигурные скобки:

sub AAR {
   my ($ref) = @_;
   print "ref = $ref\n";
}

Это печатает что-то вроде ref = ARRAY(0x5566c89a4710).

Затем вы можете использовать ссылку для доступа к элементам массива следующим образом:

print join(", ", @{$ref});
0 голосов
/ 02 ноября 2018

Это примерно context в Perl. Это важный аспект языка.

С выражением типа

my $var = @ary;

вы пытаетесь присвоить массив скаляру.

Это не имеет смысла в том виде, в каком оно есть, и получается, что правая часть вычисляется по количеству элементов массива и , что присваивается $var.

Чтобы изменить это поведение, вам нужно предоставить «контекст списка» оператору присваивания. В этом случае вы бы сделали

my ($var) = @ary;

и теперь у нас есть присвоение списка (элементов массива) списку (переменных здесь $var), где им присваивается один за другим. Итак, здесь первый элемент @ary назначен на $var. Обратите внимание, что это утверждение не соответствует неуловимому понятию «список».

Итак, в вашем случае вы хотите

my ($ref) = @_;

и первый элемент из @_ назначается на $ref, если необходимо.

В качестве альтернативы, вы можете удалить и вернуть первый элемент @_, используя shift , и в этом случае скалярное контекстное присваивание имеет порядок

my $ref = shift @_;

В этом случае вы также можете сделать

my $ref = shift;

, поскольку shift по умолчанию работает на @_.

Это подходит, когда вы хотите удалить первый элемент ввода при его назначении, чтобы оставшиеся @_ хорошо подходили для дальнейшей обработки. Это чаще всего полезно в объектно-ориентированном коде.

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