我有一个存储对象的共享数组。
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 :(得分:0)
在这种情况下,分享是一个红鲱鱼。如果省略它,你会看到相同的行为。
@A::LISTS
的元素是受祝福的引用,数组副本中的元素也是如此。因此,$A::LISTS[0]
指向内存中的某个位置,而$test1[0]
中的副本指向同一位置 - 换句话说,它们包含相同的对象。
您需要明确单独制作对象副本以达到您想要的效果:
use Clone qw(clone);
my @copies = map { clone($_) } @A::LISTS;