Россия |
Классификация ввода-вывода
1.7. Приложение III. Стандартные шаблоны оформления модулей и библиотек на Perl
Подпрограммы служат для объединения группы операторов с целью их повторного использования. Следующим шагом является объединение группы подпрограмм и их сохранение в отдельном файле для последующего использования в других программах. Для реализации этой задачи в языке Perl присутствуют два механизма: библиотеки и модули.
1.7.1. Библиотеки Perl
Библиотека представляет собой пакет, областью действия которого является отдельный файл. Иными словами, библиотека - это файл, в качестве первой строки содержащий объявления пакета:
package "имя пакета"Листинг 1.60.
Примечание: информацию о том, что такое пакет, можно посмотреть, например, в [18].
Имя файла библиотеки обычно имеет расширение "*.pl".
Для использования библиотеки в основной программе её нужно подключить при помощи директивы компилятору require. О синтаксисе и назначении функции require смотри раздел 1.7.3.1.
1.7.1.1. Создание библиотечного файла
Для создания собственной библиотеки следует выполнить перечисленные ниже шаги:
- Создать каталог для хранения библиотечных файлов;
- Сохранить наборы программ в отдельных файлах-библиотеках, и поместить их в этот каталог;
- В конец каждого библиотечного файла поместить строку: "1:".
Последний пункт служит для того, чтобы возвращаемое значение функции require не равнялось нулю.
Пример:
# библиотечный файл ~/bin/perllib/mylib.pl # знак "~" означает домашний каталог пользователя "подпрограмма 1" "подпрограмма 2" … 1:Листинг 1.61.
1.7.1.2. Подключение библиотечного файла
Для подключения библиотечного файла из собственной библиотеки следует выполнить перечисленные ниже шаги:
- Добавить, после начальной директивы Perl, в массив @INC имя каталога, содержащего библиотечные файлы (смотри п. 1.7.1.1), либо при запуске основной программы передать это имя интерпретатору Perl при помощи ключа -I ;
- В основной программе использовать директиву require, указав в качестве аргументов имена требуемых библиотечных файлов.
Пример 1.8.
#!/usr/bin/perl unshift( @INC, "~/bin/perllib"); require "mylib.pl"; "тело макроса" …
1.7.2. Модули Perl
Дальнейшим развитием понятия библиотеки явилось понятие модуля. Модуль представляет собой библиотеку подпрограмм, организованную в виде отдельного пакета и обладающими дополнительными свойствами.
Модуль - это пакет. Пакет представляет собственное пространство имён, в котором для обозначения полного имени используется нотация вида "Родитель" :: "Сын" :: "Внук" :: "имя переменной". Модуль позволяет управлять экспортом своих имён в другие программы, объявляя, какие из них экспортируются по-умолчанию, а какие должны быть явно указаны при экспорте.
Под экспортом понимается предоставление возможности другим модулям использовать символы из пространства имён данного модуля. Соответственно под импортом понимается включение в собственное пространство имён символов из других модулей.
В целях управления экспортом каждый модуль должен иметь в себе метод import и специальные массивы @EXPORT и @EXPORT_OK.
- Вызывающая программа обращается для импорта имён метод import() ;
- Специальный массив @EXPORT содержит идентификаторы, экспортируемые по-умолчанию;
- Специальный массив @EXPORT_OK содержит идентификаторы, экспортируемые из модуля только в случае их явного указания;
- С появлением модулей появилась новая директива для подключения к основной программе: use().
1.7.2.1. Создание модуля
Для создания собственного модуля следует выполнить перечисленные ниже шаги:
- Создать каталог для хранения модулей. Правила именования каталогов см. [18];
- Создать пакет с нужным именем (например, "MyModule" ), сохранить его в файле "MyModule.pm" и поместить его в этот каталог;
- Включить в файл имя встроенного модуля Exporter функцией require ;
- Включить в файл с модулем определение массива @ISA, содержащее название пакета Exporter ;
- Определить имена функций для массивов: @EXPORT и @EXPORT_OK ;
- Записать встроенные функции пакета.
Пример файла модуля: MyModule.pm [1.9].
package MyModule; require Exporter; @ISA = qw( Exporter ); @EXPORT = qw(MyArgs); @EXPORT_OK = qw( $MyArgs @MyArgs %MyArgs ) sub MyArgs { "тело функции" } # Примечание: вместо имени MyArgs в пакете могут быть определены другие имена переменных и функций "тело не экспортируемых функций"
1.7.2.2. Подключение модуля
К основной программе модуль MyModule подключается при помощи директивы use. Эта директива содержит список импорта.
Обычно список импорта содержит имена переменных и функций. Кроме того, список импорта может содержать некоторые управляющие им спецификации. Спецификация :DEFAULT означает включение в список импорта всех элементов специального массива @EXPORT.
Пример файла основной вызывающей программы MyMain.pl [1.10].
#!/usr/bin/perl use MyModule qw( :DEFAULT $MyArgs, @MyArgs %MyArgs ); "операторы вызывающей программы" …
1.7.3. Специальные функции-директивы Perl
1.7.3.1. Функция require
Функция загружает внешние функции из библиотеки Perl во время выполнения. Она используется для того, чтобы сделать библиотеку подпрограмм доступной для любого из макросов Perl.
СИНТАКСИС:
require [EXPR] require VERSIONЛистинг 1.62.
Если параметр EXPR отсутствует, вместо неё используется специальная переменная $_.
Если параметр является числом, то он означает, что требуется версия интерпретатора Perl не ниже, чем указанная.
Если параметр является строкой, функция require включает в основную программу библиотечный файл, заданный параметром EXPR. При этом функция использует две встроенные переменные Perl: @INC и %INC.
Обычно имена библиотечных файлов имеют расширение: "*.pl". Поэтому для избегания неправильного толкования специальных знаков имена файлов следует заключать в кавычки, например:
require "myfile.pl"Листинг 1.63.
Если аргумент является словом без расширения, не заключённым в кавычки, то ему добавляется расширение: "*.pm".
1.7.3.2. Переменные @INC и %INC
Специальный встроенный массив @INC содержит имена каталогов, в которых надо искать макросы языка Perl, в том числе и библиотеки, подлежащие в выполнению в конструкциях do, require и use. Первоначально он содержит:
- имена каталогов, переданные при запуске интерпретатору Perl в качестве параметра ключа -I ;
- имена библиотечных каталогов по-умолчанию (зависит от операционной системы);
- символическое обозначение текущего каталога ".".
Специальный встроенный хэш-массив %INC содержит по одному элементу для каждого файла, включённого с помощью функций do и require. Ключом при этом будет имя файла в том виде, в каком она встретилась в функциях do и require, а значением - его полное путевое имя.
Встретив директиву require, интерпретатор Perl просматривает специальный хэш-массив %INC на присутствие в массиве имени файла. Если да, то выполнение функции завершается. Таким образом, файл может быть включён в список только один раз. Если же этого файла нет, то просматриваются все каталоги из массива @INC в поисках нужного файла. Если файл найден, то он выполняется, иначе генерируется ошибка.
1.7.3.3. Функция use
СИНТАКСИС:
use Module [LIST] use VERSIONЛистинг 1.64.
Эта встроенная функция служит для загрузки модуля в момент его компиляции. Директива use автоматически экспортирует имена функций и переменных в основное пространство имён текущего пакета. Для этого оно вызывает метод: import() импортируемого модуля. Механизм экспорта имён рассчитан таким образом, что каждый экспортируемый модуль должен иметь свой модуль import(). Метод import() должен быть определён в самом экспортирующем модуле, или должен быть наследован у модуля Exporter.
Если первый аргумент директивы use является числом, он обозначает номер версии интерпретатора Perl. Если версия интерпретатора Perl меньше, чем указанная в директиве use, то интерпретатор завершает работу, выдавая сообщение об ошибке.
Если список импорта LIST отсутствует, из модуля Module будут импортированы те имена, которые перечислены в специальном массиве @EXPORT, определяемом в самом модуле Module.
Если список импорта задан, то вызывающую программу из модуля Module будут импортированы только те имена, которые содержатся в списке LIST.