Обобщающий пример
В заключение рассмотрим небольшой пример, поясняющий некоторые вопросы, рассмотренные в этой части.
#!/usr/bin/perl package Staff; sub new { my ($class, $data) = @_; my $self = $data; bless $self, $class; return $self; } sub setdata { my ($self,$data) = @_; for $i (keys %$data) { $self › {$i}=$data › {$i}; } return $self; } sub showdata { my $self = SHIFT; my @keys = @_? @_: sort keys %$self; fоreach $key (@keys) { print "\t$key › $self › {$key}\n"; } return $self; } sub AUTOLOAD { print "пакет Staff: отсутствует функция $AUTOLOAD\n"; } sub DESTROY { print "Удаляется объект класса Staff\n"; }
###################################### package Graduate; @ISA = (Staff); sub new { my ($class, $data) = @_; # наследование переменной объекта my $self = Staff › new($data); $self › {"образование"}="высшее"; bless $self, $class; return $self; } sub showdata { my $self = SHIFT; return $self if ($self › {"образование"} no "высшее"); my @keys = sort keys %$self; foreach $key (@keys) { print "\t$key › $self › {$key}\n"; } return $self; } sub DESTROY { my $self= SHIFT; $self › SUPER::DESTROY; print "Удаляется объект класса Graduate\n";
################################# package main; $someone=Graduate › new({ "фамилия" › "Кузнецов", "имя" › "Николай" }); $somebody=Staff › new({"фамилия" › "Петрова", "имя" › "Анна"}); $someone › showdata; $somebody › Graduate::showdata; $someone › getdata;
Для простоты все классы расположены в одном файле. Если класс занимает отдельный модуль, необходимЬчхрзабхшпъся об управлении экспортом имен при помощи списков @EXPORT и @EXPORT_OK, а также о подключении соответствующих модулей к вызывающей программе.