Шаг 133.
Модули. Создание и подключение модуля

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

    Для создания модуля MyModule следует создать пакет и сохранить его в файле MyModule.pm. Расширение .pm является признаком того, что данный файл является модулем Perl.

    В следующем примере мы создадим собственный модуль MyModule, содержащий одну функцию MyArgs(), одну скалярную переменную $MyArgs, один массив @MyArgs и один хеш-массив %MyArgs. Затем создадим файл основной программы MyMain.pl, экспортирующий модуль MyModule, используя директиву use.

    Файл модуля MyModule.pm:

package MyModule;
require Exporter;

@ISA = qw(Exporter);
@EXPORT = qw(MyArgs);
@EXPORT_OK = qw($MyArgs @MyArgs %MyArgs);

sub MyArgs 
{
  my ($x, $i);
  @MyArgs = @_;
  $MyArgs = $#MyArgs + 1;
  foreach $x (@MyArgs) 
  { 
    $MyArgs{$x}=++$i;
  }
}

    Файл основной вызывающей программы perl133_1.pl:

#! perl -w
use MyModule qw(:DEFAULT $MyArgs @MyArgs %MyArgs);
MyArgs one, two, three, four;
print "число аргументов=$MyArgs\n";
print "массив аргументов: @MyArgs\n";
print "хеш-массив аргументов:\n";
foreach $k (keys %MyArgs) 
{
  print "\$MyArgs{$k}=$MyArgs{$k} "; 
}
Текст этого примера можно взять здесь.

    Первые пять строк файла MyModule.pm являются стандартными для определения модуля Perl. Их можно использовать в качестве образца при создании собственных модулей.

    Первая строка служит определением пакета.

    Вторая строка осуществляет включение встроенного модуля Exporter. Так предоставляется возможность наследовать метод import, реализованный в этом модуле, и использовать стандартные соглашения для задания списка импорта в вызывающей программе.

    Третья строка определяет массив @ISA, состоящий из одного элемента, содержащего название пакета Exporter. С каждым пакетом ассоциируется свой массив @ISA, включающий имена других пакетов, представляющих классы. Иногда интерпретатор встречает обращение к методу, не определенному в текущем пакете. Он ищет этот метод, просматривая пакеты, определенные в массиве @ISA текущего пакета. Таким образом в языке Perl реализован механизм наследования.

    В четвертой и пятой строках определяются имена, которые будут экспортироваться за пределы модуля. Специальный массив @EXPORT содержит имена, экспортируемые по умолчанию. В четвертой строке указывается, что из данного модуля по умолчанию будет экспортировано имя функции MyArgs.

    В пятой строке специальный массив @EXPORT_OK содержит имена, которые будут экспортироваться только в том случае, если они явно указаны в списке импорта вызывающей программы. В примере это имена переменной $MyArgs, массива @MyArgs и ассоциативного массива %MyArgs.

    Функция MyArgs подсчитывает число своих аргументов и запоминает его в переменной $MyArgs. Затем она помещает аргументы в массив @MyArgs и формирует ассоциативный массив %MyArgs, в котором ключами являются имена аргументов функции MyArgs, а значениями - их порядковые номера.

    К основной программе perl133_1.pl модуль MyModule подключается при помощи директивы use. Директива use содержит список импорта

  qw(:DEFAULT $MyArgs @MyArgs %MyArgs)

    Обычно список импорта включает в себя имена переменных и функций. Кроме того, он может содержать некоторые управляющие им спецификации. Спецификация :DEFAULT означает включение в список импорта всех элементов специального массива @EXPORT. В нашем случае это значит, что в список импорта будет добавлено имя функции MyArgs, содержащееся в списке @EXPORT. Кроме того, список импорта явно содержит имена $MyArgs, @MyArgs и %MyArgs. Экспорт этих имен по явному запросу вызывающей программы разрешен модулем MyModule путем их включения в список @EXPORT_OK.

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


Рис.1. Результат работы скрипта

    На следующем шаге мы рассмотрим функцию no().




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