Шаг 126.
Пакеты. Конструктор и деструктор пакета BEGIN и END

    На этом шаге мы рассмотрим создание и использование конструкторов и деструкторов.

    Конструктором в объектно-ориентированном программировании называется специальная подпрограмма, предназначенная для создания объекта. Деструктором называется подпрограмма, вызываемая для выполнения завершающих действий, связанных с ликвидацией объекта: закрытие файлов, вывод сообщений и т. д.

    Для создания пакета, как мы знаем, требуется только его объявление (в том числе, предполагаемое по умолчанию объявление package main). Вместе с тем, существуют специальные подпрограммы, выполняющие функции инициализации и завершения пакета. По аналогии их можно назвать конструкторами и деструкторами пакета, хотя никаких пакетов они не создают и не удаляют. Это подпрограммы BEGIN и END. При описании этих подпрограмм ключевое слово sub, необходимое при объявлении обычной подпрограммы, можно опустить. Таким образом, синтаксис подпрограмм BEGIN, END имеет вид:

   BEGIN {block} 
   END {block}

    Подпрограмма BEGIN выполняется сразу после своего определения до завершения компиляции оставшейся части программы. Попробуйте запустить интерпретатор perl в интерактивном режиме. Если ему передать строку

   print  "Привет!";
то он напечатает ее только после того, как обнаружит во входном потоке признак конца файла (например, комбинацию <Ctrl>+<D>). Если же в интерактивном режиме определить конструктор пакета
   BEGIN {print "Привет!"};
то вывод строки "Привет!" будет осуществлен немедленно. Это свойство конструктора можно использовать, чтобы в начале пакета определять или импортировать имена из других пакетов. Затем эти имена будут влиять на процесс компиляции оставшейся части пакета.

    Можно определить несколько блоков BEGIN внутри файла, они будут выполняться один за другим в порядке определения.

    Подпрограмма END выполняется настолько поздно, насколько это возможно, т.е. при завершении работы интерпретатора. Можно указать несколько блоков END, при этом они будут выполняться в порядке, обратном определению.

  END {
  print "Завершаем работу, до свидания\n";
}
  BEGIN {
    print "Привет, начинаем работу\n";
}
  print "Это тело программы\n"; 
  BEGIN {
  print "Еще один блок BEGIN после блока END\n";
}

    Здесь сознательно выбран не совсем естественный порядок следования конструкторов и деструкторов BEGIN и END в тексте программы, чтобы подчеркнуть, в каком порядке они будут вызываться. Вывод выглядит так:

Привет, начинаем работу
Еще один блок BEGIN после блока END
Это тело программы
Завершаем работу, до свидания

    На следующем шаге мы рассмотрим автозагрузку.




Предыдущий шаг Содержание Следующий шаг