Вот пересмотренная версия:
use strict;
use warnings;
my $updater = AutoUpdater->new( $site_url, USERNAME, PASSWORD );
$updater->do_login();
{
package AutoUpdater;
use parent qw( WWW::Mechanize );
sub new {
my $class = shift;
my $self = $class->SUPER::new();
$self->{AutoUpdater} = {
site_url => shift,
USERNAME => shift,
PASSWORD => shift,
};
return $self;
}
sub do_login {
my $self = shift;
my $data = $self->{AutoUpdater};
$self->get("http://$data->{site_url}/login/index.php");
$self->form_id("login");
$self->field("username", $data->{USERNAME});
$self->field("password", $data->{PASSWORD});
$self->click();
$self->get("http://$data->{site_url}/");
print $self->content();
}
} # end package AutoUpdater
Некоторые примечания:
Вы всегда должны использовать строгие и предупреждения , чтобы помочь поймать ваши ошибки.
Синтаксис косвенного объекта не рекомендуется.Используйте Class->new
вместо new Class
.
Прагма base имеет некоторые нежелательные эффекты, которые нельзя исправить по причинам обратной совместимости.Для его замены была разработана прагма parent .
Ваша большая проблема заключалась в том, что Perl не инициализирует базовые классы автоматически.При необходимости вы должны явно вызвать $class->SUPER::new
.
Другая ваша большая проблема заключалась в понимании того, как обрабатываются данные экземпляра объекта.Большинство объектов Perl являются hashrefs, и вы обращаетесь к данным экземпляра, используя синтаксис hashref.При создании подкласса класса, который я не писал, мне нравится использовать второй хэш-код, чтобы избежать конфликтов с родительским классом.Помните, что вы делитесь объектом с базовыми классами.Если ваш подкласс использует поле site_url
, а затем более поздняя версия базового класса начнет использовать site_url
для чего-то другого, ваш код внезапно сломается без видимой причины.Используя только один ключ в hashref базового объекта (и тот, который базовый класс вряд ли начнет использовать), вы сводите к минимуму вероятность поломки в будущем.
В то время как Moose предоставляет некоторые приятные функциидля OO-программирования на Perl, если вы просто пишете довольно простой подкласс класса, не принадлежащего Moose, вероятно, лучше этого избегать.