Назначить адрес одного массива в другой в Perl возможно?

В следующем коде C #:

int[] X = new int[2];
X[0] = 1;
X[1] = 2;
int[] Y = X;
X[1] = 3;

После того, как это выполнится, Y [1] также будет равен 3, так как операция Y = X не делает клон, а скорее назначает ссылку или указатель того, на что X указывает на Y.

Если та же операция выполняется в Perl 5:

my @X = (1, 2);
my @Y = @X;
$X[1] = 3;

В отличие от C #, Y [1] - это не 3, а 2, что указывает на то, что Perl делает копию массива после операции @Y = @X.

Итак, мой вопрос - есть ли способ назначить или инициализировать массив Perl 5 со ссылкой на другой массив Perl, чтобы они оба указывали на одни и те же данные? Я уже знаю о ссылках и пытался разыменовать ссылку на массив, но это тоже делает копию. Я'Я также знаю, что использование ссылки на массив решит большую часть того, что яя пытаюсь сделать, поэтому я неНе нужно никаких ответов, показывающих, как работать со ссылками.

Ответы на вопрос(4)

В Perl массив не является указателем.

Вы можете получить ссылку на массив с помощью\ оператор:

my @array = ( 1, 2 );
my $array_ref = \@array;

$array_ref затем будет указывать на исходный массив (как в C)

${$array_ref}[0] = 3

изменит первую ячейку исходного массива (т.е.$array[0] будет 3)

Решение Вопроса

Вы'используется ссылка в программе C #, но не в программе Perl. Это работает так же, если вы используете ссылку в Perl.

my $X = [ 1, 2 ];
my $Y = $X;
$X->[1] = 3;
print "@$Y\n";  # 1 3

или же

my @X = ( 1, 2 );
my $Y = \@X;
$X[1] = 3;
print "@$Y\n";  # 1 3

Вы также можете создать псевдоним.

use Data::Alias qw( alias );

my @X = ( 1, 2 );
alias my @Y = @X;
$X[1] = 3;
print "@Y\n";  # 1 3
 ikegami20 окт. 2012 г., 00:16
@ Боб Брайан, вы можетеМассивы в качестве значений хэша. Значения хеш-функции могут быть только скалярами, такими как ссылки на массивы.
 ikegami20 окт. 2012 г., 06:51
хеш массивов " это сокращение от "хеш ссылок на массивы, То, что у вас там есть так же, какmy @anon1 = ("fred", "barney"); my @anon2 = ("george", "jane", "elroy"); my @anon3 = ("homer", "marge", "bart"); %Hoa = (flinstones => \@anon1, jetsons => \@anon2, simpsons => \@anon3); Вы'работаешь со ссылками. Там'Нет причин вводить псевдонимы.
 Bob Bryan20 окт. 2012 г., 04:43
Я все еще новичок в Perl, поэтому я могу ошибаться по этому поводу. Но, согласно Программированию на Perl, 4-е издание в главе 9: Структуры данных на стр. 374 в разделе Хэши массивов показывает несколько примеров того, как добавить массивы в хэш:% Hoa (flinstones => ["Фред ","гулянка»], jetsons => ["джордж ","джейн ","Elroy»], симпсоны => ["Гомер ","marge ","Барт"],); Если этот код не создает хэш массивов, не могли бы вы объяснить, что он делает ".
 Bob Bryan19 окт. 2012 г., 00:13
Если используется сложная структура данных - например, массив хеш-таблиц, содержащих в качестве значений массивы. Можно ли использовать псевдоним для получения каждой из этих отдельных структур, включая массив, используемый внутри значения хеш-таблицы? На других языках это легко сделать. Если это не может быть легко сделано в Perl, то это подразумевает, что сложные структуры данных должны использовать ссылки вместо этого. Так, например, приведенная выше структура данных может быть определена как массив ссылок на хэш, содержащих значения ссылок на массивы.

Чтобы создать ссылку на определенную именованную переменную, используйте обратную косую черту следующим образом:

my @x = (1,2);
my $y = \@x;            # create reference by escaping the sigil

$y->[1] = 3;            # $x[1] is now 3
for ( @$y ) { print }   # how to reference the list of elements

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

my $x = [1,2];          # square brackets create array reference
my $y = $x;             # points to the same memory address

Ссылка является скалярным значением, поэтому$y в твоем случае. Если вы поместите ссылку на массив в массив, вы получите двумерный массив, который удобно знать для дальнейшего использования. Например.:

my @two = (\@x, \@y);                 # $two[0][0] is now $x[0]
my @three = ( [1,2], [3,4], [4,5] );  # using anonymous arrays

Попробуйте сделать это:

my @X = (1, 2);
my $ref = \@X;        # $ref in now a reference to @X array (the magic is `\`)
$ref->[0] = "foobar"; # assigning "foobar" to the first key of the array
print join "\n", @X;  # we print the whole @X array and we see that it was changed

Ваш ответ на вопрос