[Kiev-pm] [Moscow.pm] Работа со слабыми (weaken) ссылками в Perl

Ilya Chesnokov chesnokov.ilya at gmail.com
Tue May 2 03:29:37 PDT 2017


2 мая 2017 г., 13:13 пользователь Коваль Вячеслав via Moscow-pm
<moscow-pm at pm.org> написал:
> Здравствуйте!
> Имеется такой код
>
> #!/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

Потому что все ссылки на хеш, хранившийся у вас ранее в $struct -
слабые. Нет ни одной "сильной" ссылки, в результате чего ссылка
превращается в undef.

> Вариант с блоком кода в документации понятен
>
> {
>     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 на структуре, в результате
> она уничтожается не до конца понятен

Там до блока кода есть еще несколько слов о том, как это вообще все работает :)

    ... weak reference. This means that it
    will not hold a reference count on the object it references. Also, when
    the reference count on that object reaches zero, the reference will be set
    to undef...


> --
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org
>



-- 
Best regards,
Ilya Chesnokov


More information about the Kiev-pm mailing list