Модуль Perl

Perl модуль (англ. modules) — окрема програмна структура в мові програмування Perl, яка має власний простір назв, змінні, процедури та має механізм експорту визначених назв в загальний простір назв програми, до якої додається модуль. Кожний модуль має власну назву, який завдає простір назв та відбивається на файл з текстом програми модуля. Наприклад, модуль Net::Time:

  • має простір назв Net::Time;
  • знаходиться в файлі Net/Time.pm. В Unix-подібних операційних системах, пошук модулів виконується в теках /usr/lib/perl5, /usr/local/lib/perl5.

В мережі існує централізоване сховище модулів CPAN, в якому зберігаються майже всі розроблені Perl-модулі.

Завдяки підтримки Perl одночасно декількох парадигм програмування, то модулі можуть бути написані як в процедурному стилі, так й в об'єктно-орієнтованому. Одночасно можуть використовуватись модулі, написані в будь-якій стиль.

Текст модуля також включає документацію по його використанню, яка оформлюється в POD форматі. За прийнятою практикою в Perl, структура POD-документації робиться робиться за структурою довідкових сторінок UNIX.

Приклад

[ред. | ред. код]

Нижче, на прикладі класичного Hello world! наведено різні стилі організації модулів. Важливо підкреслити — модулі в Perl є необов'язковими, на відміну, наприклад, від [Java]] в якому завжди потрібно визначати клас. Можна визначити функцію «Hello, World» так:

sub hello { "Hello, world!\n" } print hello(); 

або скорити до однієї стрічки:

print "Hello, world!\n"; 

Нижче цей же приклад в різних парадигмах.

в процедурному стилі

[ред. | ред. код]

Приклад показує оформлення модуля із застосуванням процедурного стиля.

Код програми з підключенням модуля та викликом функції.

#!/usr/bin/perl # Підключення модуля та імпорт всіх його публічних функцій в простір назв програми   use Hello::World; # підключення модуля  print hello();             # друкує з модуля "Hello, world!\n" print hello("Milky Way");  # друкує "Hello, Milky Way!\n" 

Текст модуля Hello/World.pm.

package Hello::World; # Назва модуля й одночасно простір назв, де будуть знаходиться всі об'єкти модуля   use strict;   # включення перевірки, що всі зміні попередньо визначені та мають початкові значення use warnings; # показувати всі попередження компілятора - зазвичай, вони не відображаються, так як                # вважається що виконується скрипт користувача our $VERSION = '1.00'; # версія модуля, зберігається в $ModuleName::VERSION use base 'Exporter';   # підключення механізму експорту назв об'єктів модуля в простір програми our @EXPORT = qw(hello); # в масиві перераховуємо назви, які експортуємо   # Строки, що починаються із символу "=" є ознакою, що далі пішов текст документації  # в форматі POD, до стрічки, яка має починатись з "=cut"  =head1 NAME   Hello::World - An encapsulation of a common output message  =head1 SYNOPSIS   use Hello::World;   print hello();   print hello("Milky Way");  =head1 DESCRIPTION  Це процедурний модуль, який друкує привітання тому, кому вказано  в параметрі процедури. Інакше - просто "Hello, world!"  =head2 Functions     Доступні наступні функції   =head3 hello     print hello();     print hello($target);  Друкує привітання. Якщо C<$target> пусте, то замість нього використовується "world".  =cut     # безпосередньо сам код функції hello() sub hello {     my $target = shift;     $target = 'world' unless defined $target;          return "Hello, $target!\n"; } =head1 AUTHOR    Joe Hacker <joe@joehacker.org> =cut  # Важливо! Кожний модуль Perl має повертати ознаку, що він успішно завантажений. #  Це будь-яке значення, яке не "0" та не пусте. Інакше він не буде завантажений.  1; 

в об'єктно-орієнтовному стилі

[ред. | ред. код]

Приклад показує оформлення модуля із застосуванням об'єктно-орієнтованого стиля (надалі — ОО). Перевага модуля OO полягає в тому, що кожен об'єкт може бути налаштований незалежно від інших об'єктів.

Код програми із створенням об'єкта та викликом метода.

#!/usr/bin/perl  use Hello::World; my $hello = Hello::World->new;    $hello->print;                # друкує "Hello, world!\n"    $hello->target("Milky Way");    $hello->print;                # друкує "Hello, Milky Way!\n"  my $greeting = Hello::World->new(target => "Pittsburgh"); # створюємо інший об'єкт    $greeting->print;             # надрукує "Hello, Pittsburgh!\n"    $hello->print;                # все ще надрукує "Hello, Milky Way!\n" 

Текст модуля Hello/World.pm

# Perl не має окремого визначення класу, на зразок зарезервованого слова 'class', #   простір назв і є клас. package Hello::World;  use strict; use warnings; our $VERSION = "1.00";  =head1 NAME Hello::World - узагальнене привітання   =head1 SYNOPSIS     use Hello::World;     my $hello = Hello::World->new();     $hello->print;   =head1 DESCRIPTION   Об'єктно-орієнтована бібліотека, що надає класичне "Hello word!" повідомлення.   =head2 Methods   =head3 new     my $hello = Hello::World->new();     my $hello = Hello::World->new( target => $target );  Екземпляри об'єкту, що містять привітання. Якщо C<$target> визначено,   то воно передається в C<< $hello->target >>.   =cut   # Конструктор об'єкта зазвичай має назву new(). Проте їм може бути будь-який метод  #  і конструкторів може бути декілька   sub new {  my($class, %args) = @_;    my $self = bless({}, $class);    my $target = exists $args{target} ? $args{target} : "world";  $self->{target} = $target;    return $self; }     =head3 target       my $target = $hello->target;     $hello->target($target);   Встановлює та повертає значення повідомлення. =cut   sub target {   my $self = shift;   if( @_ ) {       my $target = shift;       $self->{target} = $target;   }    return $self->{target}; }    =head3 to_string      my $greeting = $hello->to_string;  Повертає $greeting як рядок. =cut   sub to_string {  my $self = shift;  return "Hello, $self->{target}!"; }   =head3 print     $hello->print; Виводить привітання в стандартний потік STDOUT  =cut sub print {  my $self = shift;  print $self->to_string(), "\n"; }   =head1 AUTHOR    Joe Hacker <joe@joehacker.org> =cut  1; 

Посилання

[ред. | ред. код]