www.Litecode.ru – Сборник рецептов для создания сайтов

Создание классов в perl

ГлавнаяPerl → Классы в perl

Как создать класс в perl? Рано или поздно, любой начинающий программист задается этим вопросом. Не буду мучить цитатами из учебников по программированию и опишу в двух словах как устроенны классы в целом, и классы perl в частности. Многие ошибочно называют классами модули. Можно конечно сказать и так, если пренебречь теорией. Вообще классы это абстрактная величина, которая имеет набор методов.

Перевожу:

И когда речь идет о классе, всегда имеют ввиду скомпилированный в памяти набор методов, а не физический модуль в файле.

Классы удобно использовать для работы со сложными структурами данных, когда нужно передавать большое количество параметров в процедуру. И если использовать экспортные процедуры, то так и придется делать. Класс же способен наследовать все переменные, которые в свою очередь, будут доступны всем методам класса.

Создается класс в perl двумя этапами. Первый — модуль, второй вызов класса. Назовем наш класс MyClass.pm. Так он выглядит внутри:

#!/usr/bin/perl

package MyClass;

use strict;
our $VERSION = '1.00';

sub new {
    
    my $class = shift;
    my $self = bless {} , $class;
    
    return $self
}

1;

А затем в любом исполняемом скрипте делаем вызов:

#!/usr/bin/perl

use strict;
use utf8;
use MyClass;
use Data::Dumper;
print "Content-Type: text/html; charset=utf-8\n\n";

my $self = MyClass->new();

print Data::Dumper::Dumper( $self );

Или так:

my $self = new MyClass;

Если ошибок в синтаксисе нет, увидите такой вывод дампа:

$VAR1 = bless( {}, 'MyClass' );

Теперь переменная $self это объект, то есть ссылка на класс, который скомпилирован и находится в памяти. Класс создает оператор bless, что в переводе значит «освещать». Вот только набором методов, наш класс пока назвать нельзя. Единственный метод нашего класса это процедура new. Давайте исправим это. Добавим процедуру showENV.

#!/usr/bin/perl

package MyClass;

use strict;
our $VERSION = '1.00';

sub new {
    
    my $class = shift;
    my $self = bless {} , $class;
    
    return $self
}

sub showENV {
    
    my $self = shift;
    
    foreach my $key ( keys %ENV ) {
        
        $ .= $key ." => " . $ENV{$key}."
"; } return $ } 1;

А в скрипте делаем так:

#!/usr/bin/perl

use strict;
use utf8;
use MyClass;
use Data::Dumper;
print "Content-Type: text/html; charset=utf-8\n\n";

my $self = MyClass->new();

print $self->showENV;

Попробуйте, должно получится что-то типа этого:

REQUEST_METHOD => GET
HTTP_ACCEPT => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
DATE_GMT =>
DOCUMENT_NAME => 1.shtml
SERVER_SOFTWARE => Apache/2.2.16 (Ubuntu)
QUERY_STRING =>
REMOTE_PORT => 55037
HTTP_USER_AGENT => Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10
SERVER_SIGNATURE =>
Apache/2.2.16 (Ubuntu) Server at litecode.ru Port 80

HTTP_CACHE_CONTROL => max-age=0
HTTP_ACCEPT_LANGUAGE => ru,en-us;q=0.7,en;q=0.3
HTTP_X_REAL_IP => litecode.ru
PATH => /usr/local/bin:/usr/bin:/bin
DOCUMENT_URI => /1.shtml
GATEWAY_INTERFACE => CGI/1.1
DOCUMENT_ROOT => /home/www/docs
SERVER_NAME => litecode.ru
HTTP_ACCEPT_ENCODING => gzip,deflate
SERVER_ADMIN => admin@localhost
HTTP_CONNECTION => close
HTTP_ACCEPT_CHARSET => windows-1251,utf-8;q=0.7,*;q=0.7
LAST_MODIFIED =>
QUERY_STRING_UNESCAPED =>
SERVER_PORT => 80
REMOTE_ADDR => 127.0.0.1
SERVER_PROTOCOL => INCLUDED
HTTP_X_FORWARDED_FOR => litecode.ru
DATE_LOCAL =>
REQUEST_URI => /1
SERVER_ADDR => 127.0.0.1
USER_NAME =>
HTTP_HOST => litecode.ru

Стоит отметить, что методы класса можно вызывать так же в процедуре new, и сохранять результат в классе. Эти результаты будут доступны и в скрипте, и методам класса.