Как создать класс Perl?
Я пишу классы Perl для удаления избыточности из сценариев, и поскольку у Perl есть много способов сделать классы, у меня все время возникают проблемы с созданием классов. Так есть ли у кого-нибудь лучший пример класса?
Самый большой вопрос: если в модуле не должно быть глобальных переменных, как вы используете переменные через sub() в модуле? Подобно Java self- > foo = 10;
В принципе просто дайте мне класс, написанный на Java или С# или даже С++, и напишите на Perl. Также добавляются дополнительные баллы, показывающие, как правильно выполнять частные, защищенные и общедоступные переменные класса. Наследие и интерфейсы были бы полезны, я думаю.
Ответы
Ответ 1
типичным способом создания объектов Perl является "благословить" хэш. Экземпляр объекта может затем хранить данные против его собственного набора хеш-ключей.
package SampleObject;
use strict;
use warnings;
sub new {
my ($class, %args) = @_;
return bless { %args }, $class;
}
sub sample_method {
my ($self) = @_;
print $self->{sample_data};
}
и использование:
my $obj = SampleObject->new( sample_data => 'hello world',
more_data => 'blah blah blah' );
$obj->sample_method();
В качестве альтернативы могут быть добавлены методы accessor/mutator (см. Class:: Accessor, Class:: Accessor:: Chained и т.д.) для упрощения их настройки - это упрощает проверку данных и добавление инкапсуляции (она не применяется в Perl, вы должны убедиться, что ваш код не подходит к соответствующему accessor/mutator и напрямую получает доступ к данным в блаженном hashref).
Ответ 2
Ну, Perl прост, но я ржавый на других языках, поэтому я немного обновлю их. Вот простой класс Perl:
#!/usr/bin/perl
package Person;
use strict;
use warnings;
use Carp;
sub new {
my $class = shift;
my $self = { @_ };
croak "bad arguments" unless defined $self->{firstname} and defined $self->{lastname};
return bless $self, $class; #this is what makes a reference into an object
}
sub name {
my $self = shift;
return "$self->{firstname} $self->{lastname}";
}
#and here is some code that uses it
package main;
my $person = Person->new(firstname => "Chas.", lastname => "Owens");
print $person->name, "\n";
Вот тот же класс, написанный с использованием новых объектов стиля Moose:
#!/usr/bin/perl
package Person;
use Moose; #does use strict; use warnings; for you
has firstname => ( is => 'rw', isa => 'Str', required => 1 );
has lastname => ( is => 'rw', isa => 'Str', required => 1 );
sub name {
my $self = shift;
return $self->firstname . " " . $self->lastname;
}
#and here is some code that uses it
package main;
my $person = Person->new(firstname => "Chas.", lastname => "Owens");
print $person->name, "\n";
И MooseX:: Declare устраняет необходимость в еще большем количестве кода и делает вещи приятными:
#!/usr/bin/perl
use MooseX::Declare;
class Person {
has firstname => ( is => 'rw', isa => 'Str', required => 1 );
has lastname => ( is => 'rw', isa => 'Str', required => 1 );
method name {
return $self->firstname . " " . $self->lastname;
}
}
#and here is some code that uses it
package main;
my $person = Person->new(firstname => "Chas.", lastname => "Owens");
print $person->name, "\n";
Быстрое примечание. Эти два класса - это первые два класса Moose, которые я когда-либо писал. И вот какой-то очень ржавый код на С++ (не рубитесь на нем или вам понадобится выстрел из столбняка):
#include <stdio.h>
#include <string.h>
class Person {
char* firstname;
char* lastname;
public:
Person(char* first, char* last) {
firstname = first;
lastname = last;
}
char* name(void) {
int len = strlen(firstname) + strlen(lastname) + 1;
char* name = new char[len];
name[0] = '\0';
strcat(name, firstname);
strcat(name, " ");
strcat(name, lastname);
return name;
}
};
int main(void) {
Person* p = new Person("Chas.", "Owens");
char* name = p->name();
printf("%s\n", name);
delete name;
delete p;
return 0;
}
Ответ 3
Отметьте Moose, который является расширением объектной системы Perl 5.
Ниже вы узнаете о Музе:
Ответ 4
Помимо Муса, о котором люди уже упоминали...
Если вы просто говорите о классах (а не об объектах), вы обычно создаете данные класса с лексическими переменными, привязанными к файлу, и используете один класс для каждого файла. Вы создаете методы доступа, чтобы справиться с ними. Существуют различные способы решения этой проблемы.
Однако, похоже, вам нужно начать с чего-то вроде Intermediate Perl или Damian Conway Объектно ориентированный Perl. Там слишком много, чтобы объяснить, чтобы кто-нибудь потратил время, чтобы воспроизвести все это в ответе Stackoverflow.