Здравствуйте!
Имеется такой код
Имеется такой код
#!/usr/bin/env perl
use strict;
use warnings;
use DDP;
use Scalar::Util qw/weaken/;
my $struct = {abc => [qw/1 2 3/]};
sub set_data {
my $node = shift;
my $ref = [ $node ];
weaken($ref->[0]);
return $ref
}
my $arr_ref = set_data($struct);
p $arr_ref;
p $struct;
weaken $struct;
say '-' x 20;
p $arr_ref;
p $struct;
вывод:
\ [
[0] {
abc [
[0] 1,
[1] 2,
[2] 3
]
} (weak)
]
\ {
abc [
[0] 1,
[1] 2,
[2] 3
]
}
--------------------
\ [
[0] undef
]
undef
Не пойму, почему после weaken $struct обнуляется/удаляется структура $struct, ну и соответственно удаляется ссылка в $arr_ref
Вариант с блоком кода в документации понятен
{
my $var;
$ref = \$var;
weaken($ref); # Make $ref a weak reference
}
# $ref is now undef
или в однострочнике:
или в однострочнике:
$ perl -MScalar::Util=weaken -MDDP -E 'my $ref; { my $var = 5; $ref = \$var; weaken($ref); }; p $ref'
undef
когда мы делаем ссылку слабой и по выходу из блока ссылка уничтожается ()
а вот вариант, когда мы еще раз вызываем weaken на структуре, в результате она уничтожается не до конца понятен
а вот вариант, когда мы еще раз вызываем weaken на структуре, в результате она уничтожается не до конца понятен
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
