return "'подпрограмма 1 $Module::variable'";
}
1;
__END__
Автоматически сгенерировать скелет нового модуля (а также сопутствующие файлы, необходимые для подготовки модуля к распространению) можно с помощью утилиты h2xs, входящей в состав дистрибутива Perl. Например, создать модуль с именем 'Module::Name' версии 1.00 можно такой командой:
h2xs -AX -n Module::Name -v 1.00
Если программа, которая обращается к этому модулю, использует только экспортированные по умолчанию имена, то используется форма команды use только с именем модуля:
use Module; # подключить модуль и
# импортировать из него имена по умолчанию
subroutine(); # вызвать подпрограмму &Module::subroutine()
В программе, в которой нужно явно затребовать перечисленные имена (с помощью метода import), применяется форма команды use со списком импортируемых имен:
use Module qw($variable); # затребовать импорт нужных имен
print "$variable\n"; # скаляр $Module::variable
Антонимом команды use является команда no, которая неявно выполняет вызов метода unimport для отмены импортированных имен. В команде use также можно проверить, что версия подключаемого модуля соответствует требованиям. Для этого после имени модуля указывается минимальная требуемая версия:
use Module 1.00; # подключить модуль не ниже указанной версии
Помимо процедурного, модули могут иметь объектно-ориентированный интерфейс, который будет рассмотрен в следующей лекции.
В каждой 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)
Использование специальных блоков позволяет программисту гибко организовать контроль над программой на всех этапах ее жизненного цикла - от компиляции до завершения.