use Class::Struct; # подключаем стандартный модуль
# описываем класс Performer ("Исполнитель")
struct Performer => { # атрибуты класса:
name => '$', # "имя" - скаляр
country => '$', # "страна" - скаляр
artists => '%', # "артисты" - хэш
};
my $performer = new Performer; # создаем исполнителя
$performer->name('Pink Floyd'); # задаем значения атрибутов
$performer->country('Great Britain');
# заполняем атрибут-хэш:
$performer->artists('David Gilmour', 'гитары, вокал');
$performer->artists('Roger Waters', 'бас-гитара, вокал');
$performer->artists('Nick Mason', 'ударные');
$performer->artists('Richard Wright', 'клавишные');
# описываем класс Album ("Альбом")
struct Album => { # атрибуты класса:
title => '$', # "название" - скаляр
year => '$', # "год выхода" - скаляр
tracks => '@', # "композиции" - массив
performer => 'Performer', # "исполнитель" - объект
};
my $album = Album->new; # создаем альбом
$album->title('Dark Side of the Moon');
$album->year(1973);
# заполняем атрибут-массив:
$album->tracks(0, 'Breathe');
$album->tracks(1, 'Time');
# и так далее...
$album->performer($performer); # задаем атрибут-объект
Чтобы добавить к полученному описанию класса дополнительный метод, достаточно описать его в соответствующем пакете. Вот пример добавления метода
package Album; # переключаемся на нужный пакет
sub Album::print { # и описываем дополнительный метод
my $self = shift;
printf("%s '%s' (%d)\n",
$self->performer->name, $self->title, $self->year);
foreach my $artist (keys%{$self->performer->artists}) {
printf("\t%s - %s\n",
$artist, $self->performer->artists($artist));
}
}
package main; # переключаемся на основную программу
$album->print; # и вызываем метод объекта
В заключение рассмотрим несколько распространенных приемов для работы с классами и объектами.
Функции
sub new { # конструктор экземпляров класса
my $self = {}; # контейнер для атрибутов объекта
bless($self); # "благословить" объект ссылки
} # и вернуть ссылку (1-й аргумент bless)
При создании объекта удобно сразу задавать начальные значения его атрибутов, передавая аргументы конструктору. Если для инициализации атрибутов использовать хэш, то атрибуты можно задавать в любом порядке, а в конструкторе можно определить значения по умолчанию для незаданных атрибутов. Например, так:
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии