Язык программирования Perl

Специальные блоки


В каждой Perl-программе могут присутствовать исполняемые блоки, фактически являющиеся специальными подпрограммами, которые обрабатываются особым образом. Они имеют зарезервированные имена и записываются заглавными буквами: BEGIN, END, CHECK, INIT. Каждый из таких блоков может присутствовать несколько раз в любом месте программы. Эти блоки вызываются автоматически в определенное время в начале и в конце выполнения Perl-программы.

Блок BEGIN выполняется как можно раньше: во время компиляции сразу после того, как он полностью определен. Если определено несколько блоков BEGIN, то они выполняются в порядке их описания. Они используются командой use для загрузки внешних файлов во время компиляции программы.

Блок END выполняется как можно позже: после того как perl закончил выполнение программы, перед завершением работы интерпретатора. Он выполняется даже в случае аварийного завершения программы. Несколько блоков END выполняются в порядке, обратном их размещению в файле. Блоки END не выполняются, если при запуске Рerl заказана только компиляция (опцией -c), или если компиляция завершается аварийно. При работе END доступна специальная переменная $?, содержащая код завершения программы, который можно изменить.

Блок CHECK выполняется после того, как Рerl закончил компиляцию программы. Можно определить несколько блоков CHECK, тогда они будут выполняться в порядке, обратном их описанию. Блоки CHECK не выполняются, если Рerl запущен с опцией -c только для компиляции программы.

Блок INIT выполняется перед тем, как интерпретатор начнет выполнение программы, поэтому могут использоваться для инициализации модулей. Несколько блоков INIT выполняются в порядке их описания. Поясним последовательность выполнения специальных блоков на коротком примере:

print " 8. выполнение 1\n"; END { print "14. (1-й END)\n" } INIT { print " 5. (1-й INIT)\n" } CHECK { print " 4. (1-й CHECK)\n" } print " 9. выполнение 2\n"; BEGIN { print " 1. (1-й BEGIN)\n" } END { print "13. (2-й END)\n" } CHECK { print " 3. (2-й CHECK)\n" } INIT { print " 6. (2-й INIT)\n" } print "10. выполнение 3\n"; END { print "12. (3-й END)\n" } BEGIN { print " 2. (2-й BEGIN)\n" } INIT { print " 7. (3-й INIT)\n" } print "11. выполнение 4\n";

Сравните результаты запуска этого примера при обычном выполнении и только при компиляции:

Обычное выполнение: Только компиляция (perl -c) 1. (1-й BEGIN) 1. (1-й BEGIN) 2. (2-й BEGIN) 2. (2-й BEGIN) 3. (2-й CHECK) 3. (2-й CHECK) 4. (1-й CHECK) 4. (1-й CHECK) 5. (1-й INIT) 6. (2-й INIT) 7. (3-й INIT) 8. выполнение 1 9. выполнение 2 10. выполнение 3 11. выполнение 4 12. (3-й END) 13. (2-й END) 14. (1-й END)

Использование специальных блоков позволяет программисту гибко организовать контроль над программой на всех этапах ее жизненного цикла - от компиляции до завершения.



Содержание раздела