Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org
 

Object methods and properties

В данном примере мы рассмотрим создание , использование и наследование пакетов . Создадим скриптовый файл Clock.pm и создадим в нем модуль Clock package Clock; # constructor sub new { my $self = {}; # define variables to store timezone offset from GMT, in hours and minutes, # and city name $self->{offsetSign} = undef; $self->{offsetH} = undef; $self->{offsetM} = undef; $self->{city} = undef; bless($self); return $self; } # method to set the offset hour and minute wrt GMT # this accepts an offset direction # and two numerical parameters, hours and minutes. sub set_offset { my $self = shift; $self->{offsetSign} = shift; $self->{offsetH} = shift; $self->{offsetM} = shift; $self->{city} = shift; } # method to display current time, given offsets sub display { my $self = shift; # use the gmtime() function, used to local convert time to GMT # returns an array @GMTTime = gmtime(); $seconds = @GMTTime[0]; $minutes = @GMTTime[1]; $hours = @GMTTime[2]; # calculate time if($self->{offsetSign} eq '+') { # city time is ahead of GMT $minutes += $self->{offsetM}; if($minutes > 60) { $minutes -= 60; $hours++; } $hours += $self->{offsetH}; if($hours >= 24) { $hours -= 24; } } else { # city time is behind GMT $seconds = 60 - $seconds; $minutes -= $self->{offsetM}; if($minutes < 0) { $minutes += 60; $hour--; } $hours -= $self->{offsetH}; if($hours < 0) { $hours = 24 + $hours; } } # make it look pretty and display it $self->{localTime} = $hours.":".$minutes.":".$seconds; print "Local time in $self->{city} is $self->{localTime}\n"; } 1; В модуле есть такие переменные , как название города , разница между локальным временем и GMT . Теперь создадим скриптовый файл myclock.pm , в котором используем созданный модуль : use Clock; $london = new Clock; $london->set_offset("+", 0, 00, "London"); $london->display(); $bombay = new Clock; $bombay->set_offset("+", 5, 30, "Bombay"); $bombay->display(); $sydney = new Clock; $sydney->set_offset("+", 11, 00, "Sydney"); $sydney->display(); $us_ct = new Clock; $us_ct->set_offset("-", 6, 00, "US/Central"); $us_ct->display(); Вывод будет таким : Local time in London is 8:10:1 Local time in Bombay is 13:40:1 Local time in Sydney is 19:10:1 Local time in US/Central is 2:10:59 Теперь давайте воспользуемся такой перловой фичей , как наследование Создадим еще один скриптовый файл AlarmClock.pm , в котором создадим пакет AlarmClock , унаследованный от модуля Clock . Его содержимое будет таким : package AlarmClock; # tell the new package to use the Clock.pm module require Clock; # make methods available from "Clock" @ISA=("Clock"); 1; В скриптовом файле myclock.pm запишем : #!/usr/bin/perl require AlarmClock; $mumbai = new AlarmClock; $mumbai->set_offset(5,30, "Bombay"); $mumbai->display; Мы получим вывод : Local time in is 5:4:34 Пакет AlarmClock унаследовал все проперти и методы от пакета Clock . @ISA - специальный перловый массив , с помощью которого мы указываем , от кого унаследуется текущий пакет . В пакет AlarmClock мы можем добавлять новые методы , которые будут работать наряду с унаследованными : package AlarmClock; # this tells it to use the Clock.pm module require Clock; # this makes methods available @ISA="Clock"; # simple subroutine to increase the value of the "hours" variable by one sub adjustHoursByOne { my $self=shift; $self->{offsetH}++; } 1; Одной из особенностью перла является то , что все методы по определению виртуальные . Например : создадим в пакете AlarmClock метод display(): package AlarmClock; # lots of code sub display { print "This clock is broken. Aargh!!\n"; } 1; Теперь , если в myclock.pm вызвать такой код : #!/usr/bin/perl require AlarmClock; $mumbai = AlarmClock->new; $mumbai->set_offset(5,30, "Bombay"); $mumbai->display; то будет вызван AlarmClock-ский display(). Если же нам нужно , чтобы вызывался Clock-ский display() , прийдется прописать : #!/usr/bin/perl require AlarmClock; $mumbai = AlarmClock->new; $mumbai->set_offset(5,30, "Bombay"); $mumbai->Clock::display; Что касается деструкторов : обьекты в перле удаляются автоматически , если на них нет ссылок , или сразу после использования скрипта . Пример использования деструктора : package AlarmClock; # lots of code sub DESTROY { print "I'm outta here!\n"; } 1;
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье