Модуль 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;