Модуль PopParser. Еще одним важным компонентом сценария pop_fetch.pl является модуль PopParser, который создает подкласс класса Net::POP3 таким образом, чтобы интерпретация сообщений MIME происходила одновременно с их выборкой. Код модуля PopParser. pm приведен в листинге ниже.
0:. package PopParser; 1: # Файл: PopParser.pm 2: use strict; 3: use Net::POP3; 4: use MIME::Parser; 5: use vars '@ISA'; 6: @ISA = qw(Net::POP3); 7: # Перекрыть метод new() модуля Net::POP3 8: sub new { 9: my $pack = shift; 10: return unless my $self = $pack->SUPER::new(@_); 11: my $parser = MIME::Parser->new; 12: $parser->output_dir($ENV{TMPDIR) || '/trap'); 13: $self->parser($parser); 14: $self; 151 } 16: # Средство доступа к объекту MIME::Parser 17: sub parser { 18: my $self = shift; 19: ${*$self}{'pp_parser'} = shift if @_; 20: return ${*$self}{'pp_parser'} 21 } 22: # Переопределение метода get () 23: sub get { 24: my $self = shift; 25: my $msgnum = shift; 26: my $fh = $self->getfh($msgnum) 27: or die "Can't get message: ",$self->message,"n"; 28: return $self->parser->parse($fh); 29: }
Строки 1-6. Загрузка модулей. Включена строгая проверка и загружены модули Net::POP3 и MIME::Parser. Применяется глобальный массив @ISA, который сообщает интерпретатору языка, что PopParser является подклассом класса Net::POP3.
Строки 7-15. Переопределение метода new(). Метод new() модуля Net::РОРЗ переопределяется в целях создания и инициализации объекта mime::Parser для последующего использования. Вначале вызывается метод new() родительского объекта для создания основного объекта и подключения его к удаленному хосту, затем создается и настраивается объект mime::Parser. Полученный синтаксический анализатор сохраняется для последующего использования путем вызова метода parser(), который представляет собой средство доступа к объекту mime::Parser.
Строки 16-21. Метод parser(). Этот метод представляет собой средство доступа к объекту MIME::Parser, созданному в результате вызова метода new(). Если данный модуль будет вызван с передачей объекта синтаксического анализатора в стеке подпрограммы, то объект будет сохранен как одна из переменных экземпляра. В ином случае текущий объект синтаксического анализатора будет возвращен вызывающей процедуре.