Вопрос по perl, arrays – Perl: ссылка на массив или анонимный массив

8

Это может быть глупым вопросом ... Следующий код выводит содержимое@arrayref а также@arraycont соответственно. Обратите внимание на разницу между ними и способ их назначения. Я знаю, что делает анонимный массив, но кто-нибудь может объяснить, почему есть разница?

Большое спасибо.

<code>@arrayref = ();
@array = qw(1 2 3 4);
$arrayref[0] = \@array;
@array = qw(5 6 7 8);
$arrayref[1] = \@array;
print join "\t", @{$arrayref[0]}, "\n";
print join "\t", @{$arrayref[1]}, "\n";

@arraycont = ();
@array = qw(1 2 3 4);
$arraycont[0] = [@array];
@array = qw(5 6 7 8);
$arraycont[1] = [@array];
print join "\t", @{$arraycont[0]}, "\n";
print join "\t", @{$arraycont[1]}, "\n";
</code>

выходы

<code>5   6   7   8   
5   6   7   8   
1   2   3   4   
5   6   7   8   
</code>

Ваш Ответ

3   ответа
3

Первый блок хранит адрес@array, Ссылки похожи'live streaming'Вы получаете текущий статус. Так что если вы создаете ссылку на@array, like \@array, когда вы отмените ссылку, вы всегда получите то, что@array указывает на момент отмены ссылки. Когда вы отменяете@array имел(5 6 7 8)

Когда вы делаете[@array] это как записьlive streaming на ваш диск. Поэтому, когда вы (пере) воспроизводите записанный контент, вы получаете то, что было транслировался во время записи. Итак, когда вы ссылаетесь$arraycont[0] вы получаете то, что@array имел во время копирования это
(1 2 3 4)

Error: User Rate Limit Exceeded wen.huang
0

Вы сделали сохраненные ссылки на один массив в обоих$arrayref[0] а также$arrayref[1], Вы должен был использовать разные массивы.

my @refs;

my @array1 = qw(1 2 3 4);
push @refs, \@array1;

my @array2 = qw(5 6 7 8);
push @refs, \@array2;

На практике,my выполняется в каждом проходе цикла, каждый раз создавая новый массив.

my @refs;
while ( my @row = get() ) {
   push @refs, \@row;
}

В редких случаях, когда вам нужно клонировать массив, вы можете использовать:

use Storable qw( dclone );

push @refs, [ @row ];       # Shallow clone
push @refs, dclone(\@row);  # Deep clone
11

shallow копия массива:

$arraycont[0] = [@array];

Принимая во внимание, что это просто создает ссылку на него:

$arrayref[0] = \@array;

Поскольку вы позже измените массив:

@array = qw(5 6 7 8);

arrayref по-прежнему указывает на то же место массива в памяти, поэтому при разыменовании в операторах печати он печатает текущие значения массива5 6 7 8.

Error: User Rate Limit ExceededshallowError: User Rate Limit Exceeded@arrayError: User Rate Limit Exceeded[@array]Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы