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;
|
|