Perl в настоящее время поддерживает Копировать при записи (CoW) для скалярных переменных, однако для хэш-функций и массивов-ссылок у него ничего нет.
Однако в Perl есть подпрограммы для изменениявнутренние переменные, такие как слабый , поэтому я предполагаю, что может существовать решение.
У меня есть ситуация, когда у меня большая структура, которую я возвращаю из пакета, который сохраняет внутреннее состояниеэтой большой структуры.Я хочу убедиться, что, если либо возвращенные ссылки, либо внутренняя ссылка (которые в настоящее время являются одной и той же ссылкой) будут изменены, я получу ситуацию копирования при записи, когда данные, на которые ссылаются ссылки, копируются, изменяются иссылка, используемая для изменения данных, обновляется, чтобы указывать на новые данные.
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
, я могу вызвать переменную, чтобы указать, что, если будет произведена модификация для поведения с копированием при записи.