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

修改后的值不应影响另一个数组

4

1 回答 1

0

在这种情况下,共享是一条红鲱鱼。如果您省略它,您将看到相同的行为。

的元素是@A::LISTS受祝福的引用,数组副本中的元素也是如此。所以,$A::LISTS[0]指向内存中的某个位置,而你的副本$test1[0]指向同一个位置——换句话说,它们持有同一个对象。

您需要明确地为您的对象制作单独的副本以实现您想要的:

use Clone qw(clone);

my @copies = map { clone($_) } @A::LISTS;
于 2013-10-01T16:05:12.227 回答