Здравствуйте!
Имеется такой код
 
#!/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 на структуре, в результате она уничтожается не до конца понятен
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить