Perl目前支持标量变量Copy on Write (CoW),但它似乎没有任何hashrefs和arrayrefs。
但是,Perl确实有子程序来修改weaken之类的变量内部,所以我猜测可能存在解决方案。我有一种情况,我有一个大的结构,我从一个包中返回,保持这个大结构的内部状态。我想确保如果修改了返回的引用或内部引用(它们都是当前相同的引用),我最终会遇到写入时复制的情况,其中引用所指向的数据被复制,修改和用于修改数据的引用被更新为指向新数据。
package SomePackage;
use Moose;
has some_large_internal_variable_ref => (
'is' => 'rw',
'isa' => 'HashRef',
);
sub some_operation {
my ($self) = @_;
$self->some_large_internal_variable_ref({
# create some large result that is different every time
});
}
sub get_result {
my ($self) = @_;
return $self->some_large_internal_variable_ref;
}
1;
use strict;
use warnings;
use SomePackage;
use Test::More;
# Situtation 1 where the internally stored reference is modified
# This will pass!
my $package = SomePackage->new();
$package->some_operation();
my $result1 = $package->get_result();
$package->some_operation();
my $result2 = $package->get_result();
isnt($result1, $result2, "These two references should no longer be the same");
# Situtation 2 where the externally stored references is modified
# This will fail
$package = SomePackage->new();
$package->some_operation();
$result1 = $package->get_result();
$result1->{foo} = "bar";
$result2 = $package->get_result();
isnt($result1, $result2, "These two references should no longer be the same");
done_testing;
我正在尝试避免我必须克隆get_result
返回值的情况,因为这会导致内存使用率翻倍的情况。
我希望有某种形式的weaken
我可以调用该变量来指示,如果修改是为了使用Copy on Write行为进行操作。