Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
...
11: return @ring;
...
14: while (1) { my $ring=create_ring(10) }
В двух последних примерах по окончании выполнения блока мы будем терять ссылку на элемент массива (в первом) или ссылку на сам массив (во втором), но данные массива, уже никому не доступные, будут бережно сохраняться системой сборки мусора.
Один из способов освободить память – разорвать этот круг (вернее, ring) вручную, добавив в конец блока соответствующую инструкцию:
...
14: while (1) {
15: my $ring=create_ring(10);
16: $ring->[0]{'next_ref'}=undef;
17: }
Одного разрыва вполне достаточно, чтобы система сборки мусора один за другим удалила все элементы структуры, но этот способ не выглядит изящно. Мы просто взяли на себя труд убрать мусор, но так и не заставили работать над этим интерпретатор Perl. Неужели всё так безнадёжно? Нет! В Perl есть механизмы, позволяющие «растолковать» ему все детали нашего замысла, я говорю об объектно-ориентированном подходе.
Первый пример будет основан на связывании
переменной с классом
Я буду рассчитывать на то, что читатель знает об
устройстве модулей Perl и знаком с механизмом связывания объектов с
переменными. Вкратце скажу, что Perl позволяет
Вот код, реализующий обозначенный подход:
01: #!/usr/bin/perl -w
02:
03: package MyRing;
04:
05: sub create_ring {
06: my ($length)=@_;
07: my @ring=({'value' => 0})x$length;
08: for (my $i=0; $i<$length; $i++) {
09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length];