From theathlet at yandex.ru Tue May 2 03:13:28 2017 From: theathlet at yandex.ru (=?utf-8?B?0JrQvtCy0LDQu9GMINCS0Y/Rh9C10YHQu9Cw0LI=?=) Date: Tue, 02 May 2017 11:13:28 +0100 Subject: [Kiev-pm] =?utf-8?b?0KDQsNCx0L7RgtCwINGB0L4g0YHQu9Cw0LHRi9C80Lgg?= =?utf-8?b?KHdlYWtlbikg0YHRgdGL0LvQutCw0LzQuCDQsiBQZXJs?= Message-ID: <193111493720008@web21g.yandex.ru> An HTML attachment was scrubbed... URL: From chesnokov.ilya at gmail.com Tue May 2 03:29:37 2017 From: chesnokov.ilya at gmail.com (Ilya Chesnokov) Date: Tue, 2 May 2017 13:29:37 +0300 Subject: [Kiev-pm] =?utf-8?b?W01vc2Nvdy5wbV0g0KDQsNCx0L7RgtCwINGB0L4g0YE=?= =?utf-8?b?0LvQsNCx0YvQvNC4ICh3ZWFrZW4pINGB0YHRi9C70LrQsNC80Lgg0LIg?= =?utf-8?q?Perl?= In-Reply-To: <193111493720008@web21g.yandex.ru> References: <193111493720008@web21g.yandex.ru> Message-ID: 2 мая 2017 г., 13:13 пользователь Коваль Вячеслав via Moscow-pm написал: > Здравствуйте! > Имеется такой код > > #!/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