Алексей Мичурин
Замыкания являются одной из тех особенностей Perl, которые редко
встретишь в других языках программирования. Да и программисты на Perl зачастую
не вдаются в такие дебри. Напрасно. Вы можете не иметь прав и автомобиля, не желать
стоять в пробках, но правила дорожного движения должен знать каждый. Точно так
же, даже если вы не используете замыканий, знать о них весьма полезно.
Суть замыканий
Суть замыканий состоит в том, что память, занятая под временные
переменные, не освобождается дольше, чем соответствующие переменные
остаются доступны. Сразу скажу, что возникновение замыканий никак не связано
с ошибками в интерпретаторе Perl. Больше того, мы скоро убедимся в том,
что интерпретатор «знает» о возникшем замыкании и может уведомить вас,
если вы того хотите.
Почему же память освобождается не сразу после
исчезновения переменной? Чтобы ответить на этот вопрос, надо сказать пару слов
о системе сборки мусора, которой оснащён Perl. Он автоматически освобождает
фрагменты памяти, на которые нет ссылок. Переменная может исчезнуть, но ссылка
может остаться, тогда Perl не освободит память до тех пор, пока не исчезнет
последняя ссылка.
Эта система работы со ссылками противоположна Cподходу,
где ссылка хранится независимо от соответствующего фрагмента памяти. Поэтому в
небрежно написанных программах на C случается, что ссылка указывает
на фрагмент памяти, который уже возвращён системе. Попытка обратиться к
информации по этой ссылке всегда приводит к серьёзным сбоям в работе программы.
Perl устроен иначе. В нём не может существовать
неправильной ссылки, но за это приходится платить неосвобождённой памятью.