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