Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 1:

Классификация ввода-вывода

Лекция 1: 12345678 || Лекция 2 >

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.

Лекция 1: 12345678 || Лекция 2 >
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига