Сильные ссылки
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 ) - на случай, если необходимо вновь вернуть "силу" слабой ссылке.
Комментариев нет:
Отправить комментарий