Элементы массива ref, используемые в нескольких хешах, не показаны
В следующем коде, когда содержимое массива печатается, ключ 3 hashref2 не имеет желаемых значений (я хочу добиться, чтобы hashref1 имел массив в ключе 3 со значением 1, а hashref2 имел массив в ключе 3 со значением 2).
В потоке кода мне нужно сначала заполнить хеш-значения, а затем передать данные в подмассив.
Не могли бы вы посоветовать, если использование ссылки на subarray - правильный путь?
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @array;
my @subarray;
# Puash to array
my $hashref1 = {
key1 => 'value1_1',
key2 => 'value1_2',
key3 => \@subarray
};
push (@array, $hashref1);
# push some data in subarray
push (@subarray, 'value1');
# clear subarray
splice(@subarray);
# Puash to array
my $hashref2 = {
key1 => 'value2_1',
key2 => 'value2_2',
key3 => \@subarray
};
push (@array, $hashref2);
# push some data in subarray
push (@subarray, 'value2');
print "hashref1:\n".Dumper($hashref1);
print "hashref2:\n".Dumper($hashref2);
print "array:\n".Dumper(@array);
из:
hashref1:
$VAR1 = {
'key2' => 'value1_2',
'key1' => 'value1_1',
'key3' => [
'value2'
]
};
hashref2:
$VAR1 = {
'key2' => 'value2_2',
'key1' => 'value2_1',
'key3' => [
'value2'
]
};
array:
$VAR1 = {
'key2' => 'value1_2',
'key1' => 'value1_1',
'key3' => [
'value2'
]
};
$VAR2 = {
'key2' => 'value2_2',
'key1' => 'value2_1',
'key3' => $VAR1->{'key3'}
};
2 ответа
Я думаю, вы просто не до конца понимаете, как работают ссылки. Вы в основном выдвигаете ссылку на один и тот же массив, поэтому неудивительно, что у вас есть точно такое же содержимое этого массива.
Что вам нужно сделать, это создать новую ссылку на массив. Вот правильный код:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @array;
my $subarray = [];
# Puash to array
my $hashref1 = {
key1 => 'value1_1',
key2 => 'value1_2',
key3 => $subarray
};
push (@array, $hashref1);
# push some data in subarray
push ( @$subarray, 'value1' );
# create a new subarray
$subarray = [];
# Puash to array
my $hashref2 = {
key1 => 'value2_1',
key2 => 'value2_2',
key3 => $subarray
};
push (@array, $hashref2);
# push some data in subarray
push ( @$subarray, 'value2' );
print "hashref1:\n".Dumper($hashref1);
print "hashref2:\n".Dumper($hashref2);
print "array:\n".Dumper(@array);
Вы храните ссылки на один и тот же массив во всех ваших хэш-ссылках. Это означает, что если вы измените @subarray
все хэши, имеющие ссылки на него, изменяются в унисон.
Вместо этого сделайте отдельные мелкие копии, как в
@subarray = ('value2');
my $hashref2 = {
key1 => 'value2_1',
key2 => 'value2_2',
key3 => [ @subarray ],
};
push (@array, $hashref2);