среда, 30 декабря 2015 г.

Сильные и слабые ссылки в Perl

Сильные ссылки

use strict;
use warnings;
use Scalar::Util qw/weaken/;
$\ = "\n";

my $ref; # Ссылка на какую-либо сущность
{
    my $a = 3;
    $ref = \$a;  # Берём ссылку на переменную $a.
                 # $ref - в данном случае является сильной ссылкой.

    # Так как область жизни переменной $a ограничена данным блоком,
    # то по выходу из него переменная $a должна быть уничтожена,
    # но так как количество ссылок, ссылающихся на неё не равно нулю,
    # то этого не происходит.
}

print $$ref; # 3
undef $ref;  # Обнуляем значение сильной ссылки, после чего
             # счетчик ссылок на переменную $a уменьшается на единицу 
             # и теперь он равняется нулю, а переменная $a завершает 
             # своё существование.

Слабые ссылки


Ссылки в Perl по умолчанию считаются сильными. Для того чтобы иметь возможность работать с их слабыми вариантами, воспользуемся функционалом модуля Scalar::Util.

use strict;
use warnings;
use Scalar::Util qw/weaken/;
$\ = "\n";

my $ref;
{
    my $a = 3;
    $ref = \$a;
    
    weaken($ref); # Используя данную функцию делаем ссылку $ref слабой.
                  # Суть её "слабости" заключается в том, что наличие
                  # данной ссылки никак не влияет счетчик ссылок 
                  # переменной $a; он всё так же равен нулю, как будто
                  # и нет никакой ссылки на переменную $a.
}
# И после того, как заканчиваются границы "жизни" переменной $a и 
# на неё нет сильных ссылок, которые влияют на значение её счетчика 
# ссылок, она благополучно умирает; слабая же ссылка $ref 
# становится равной undef.

print $$ref; # поэтому так уже выполнить не получится.

Так же можно отметить две другие функции Scalar::Util для работы  со слабыми ссылками это: isweak ( $ref ) - для того чтобы проверить "силу" ссылки и unweaken( $ref ) - на случай, если необходимо вновь вернуть "силу" слабой ссылке.

Комментариев нет:

Отправить комментарий