Модуль 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 <[email protected]>
=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 <[email protected]>
=cut

1;

Посилання

Ця стаття не містить посилань на джерела. Ви можете допомогти поліпшити цю статтю, додавши посилання на надійні (авторитетні) джерела. Матеріал без джерел може бути піддано сумніву та вилучено. (вересень 2018)