Просто пара вещей:
- Используйте
Local::Module
вместо module
. Пространство модуля Local
зарезервировано для модулей не-CPAN. Также, по соглашению, имена модулей должны начинаться с заглавной буквы.
- Используйте
use strict
и use warnings
.
Давайте посмотрим на вашу new
подпрограмму конструктор:
sub new
{
my $class = shift;
my $reference = shift;
bless $reference, $class;
return $reference;
};
Я не уверен, что вы пытаетесь сделать здесь. Обычно это должен быть конструктор. Вы получаете ссылочный объект обратно, вы не передаете ему ссылку. Может быть, вы имеете в виду это?
package Local::Module;
sub new {
my $class = shift;
my $reference = {};
bless $reference, $class;
return $reference;
}
Это создаст НОВЫЙ объект, который вы можете использовать для добавления. Итак, вы должны сделать это в первую очередь:
my $object = Local::Module->new;
Теперь вы можете использовать $object
как дескриптор ваших строк:
sub add_rows {
my $self = shift;
my $rowRef = shift;
if (not exists $self->{ROWS}) {
$self->{ROWS} = [];
}
push @{$self->{ROWS}}, $rowRef;
}
Теперь вы можете использовать этот объект для добавления строк:
my $object->add_row = $RowReference;
Обратите внимание, что объект в Perl обычно является ссылкой на анонимный хеш. Вы помещаете нужные данные в один из ключей вашего хэша. В этом случае вы помещаете свой массив в $ self -> {ROWS}.
Да, существуют всевозможные способы создания псевдо-хешей и хэшей наизнанку, но идея в том, что ваш класс обычно не фактические данные, а ссылка на объект, который содержит данные. В противном случае вы не используете объектно-ориентированное программирование.
В вашем случае я бы не стал беспокоиться о map
. Я сомневаюсь, что это будет более эффективно, и цикл for будет чище (не проверено):
use strict;
use warnings;
my @matrices = ([1,0,0],[0,1,0],[0,0,1]);
my @objects;
foreach my $array_ref (@matrices) {
my $module_ref = Local::Module->new;
my $module_ref->add_row($array_ref);
push @objects, $module_ref;
}
package Local::Module;
sub new {
my $class = shift;
my $reference = {};
bless $reference, $class;
return $reference;
}
sub add_rows {
my $self = shift;
my $rowRef = shift;
if (not ref($rowRef) eq "ARRAY") {
die qq(Method "add_rows" can only take an Array reference);
}
if (not exists $self->{ROWS}) {
$self->{ROWS} = [];
}
push @{$self->{ROWS}}, $rowRef;
}
Теперь ваш список @objects
- это список Local::Module
классов. Теперь вы можете сделать что-то вроде этого:
$objects[2]->add_row($row_ref);
Это очень грубый набросок. Например, вам, вероятно, нужен другой модуль, который будет возвращать ссылку на все ваши массивы. Может быть, другой, который может выталкивать и сдвигать строки в вашем массиве и возвращать вытянутую или сдвинутую строку.
Вы также можете включить способ передачи в исходную ссылку на массив:
sub new {
my $class = shift;
my $array_ref = shift;
my $reference = {};
bless $reference, $class;
if (defined $array_ref) {
$reference->add_row($array_ref);
}
return $reference;
}
Обратите внимание, что как только я благословлю $reference
, я могу использовать его в объектно-ориентированных вызовах. Таким образом, мой конструктор не знает, как выглядит мой объект. Существует общая идея, что конструктор и методы должны не знать, как устроен остальной объект. Таким образом, когда вы изменяете объект, вам нужно изменить только один или два изолированных метода. Если я изменю способ работы моего метода add_rows
, мне не нужно изменять конструктор. Изменения изолированы в одном месте.