2013-10-01 4 views
0

У меня есть общий массив, который хранит объекты.Как скопировать переменную разделяемого потока в обычный массив

package A; 
use threads; 
use threads::shared; 
our @LISTS; 
share(@LISTS); 
use B; 

my $obj = B->new(); 
my $shared_test = shared_clone($obj); 
push(@A::LISTS, $shared_test); 

Я хочу скопировать общий массив LISTS в обычный массив.

Я скопировал его в два массива в другом модуле, и когда я модифицировал один массив, он воздействует на другой массив. Вот код

my @test1 = @A::LISTS; 
my @test2 = @A::LISTS; 
$test1[0]->set_value("1"); 
print "value: ".$test1[0]->get_value()."\n"; 
$test2[0]->set_value("2"); 
print "value2: ".$test2[0]->get_value()."\n"; 
print "value1: ".$test1[0]->get_value()."\n"; 

Выход:

value: 1 
value2: 2 
value1: 2 

Но я хочу @ test1, test2 @ массивы выходят из общей. Как мне это сделать?

Я хочу выход как

value: 1 
value2: 2 
value1: 1 

измененное значение не должно влиять на другой массив

+0

К сожалению, я забыл дать ожидаемый выход. отредактированный пост с ожидаемым выходом. – kvysh

ответ

0

В этом случае разделение является отвлекающим маневром. Вы увидите такое же поведение, если опустите его.

Элементы @A::LISTS - это благословенные ссылки, а также элементы в ваших копиях массива. Итак, $A::LISTS[0] указывает на какое-то место в памяти, и ваша копия в $test1[0] указывает на то же местоположение - другими словами, они имеют один и тот же объект.

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

use Clone qw(clone); 

my @copies = map { clone($_) } @A::LISTS; 
+0

Здесь я не могу получить доступ к $ copy [0] -> get_value(); потому что он хранится на карте. – kvysh

Смежные вопросы