Как создать объекты из каждого элемента в массиве? - PullRequest
2 голосов
/ 05 марта 2012

У меня есть модуль с новым конструктором:

package myClass;

sub new
{
    my $class = shift;
    my $arrayreference = shift;
    bless $arrayreference, $class;
    return $arrayreference;
};

Я хочу сделать что-то вроде:

foreach $ref (@arrayref)
{
     $array1 = myClass->new($ref);
}

$array1 переписывается каждый раз, но я хочу, чтобы у каждого элемента в массиве было свое имя (например, $array1, $array2, $array3 и т. Д.)

Ответы [ 5 ]

5 голосов
/ 05 марта 2012

Если вы работаете с множественной структурой данных (массивом), то вам нужно сохранить результат во множественном контейнере (или нескольких скалярных контейнерах).Идомичным способом сделать это является использование функции map:

my @object_array = map {myClass->new($_)} @source_array;

Если вы знаете, что @source_array содержит фиксированное количество элементов, и вам нужны скаляры для каждого объекта:

my ($foo, $bar, $baz) = map {myClass->new($_)} @source_with_3_items;
2 голосов
/ 05 марта 2012

Вы пытаетесь сделать это на месте?

my @objects = (
    { ...args for 1st object... },
    { ...args for 2nd object... },
    ...
);

$_ = Class->new($_) for @objects;

Однако вам следует избегать повторного использования таких переменных.

my @object_data = (
    { ...args for 1st object... },
    { ...args for 2nd object... },
    ...
);

my @objects = map Class->new($_), @object_data;
2 голосов
/ 05 марта 2012

По существу нет имени разницы между $array[1] и $array1. Существует программная разница в том, что $array[1] может быть «соединен», а в современных средах Perl $array1 - нет. Таким образом, я могу написать $array[$x] для любого действительного $x и получить элемент с «виртуальным именем» $array.$x.

my @objects = map { MyClass->new( $_ ); } @data_array;

Таким образом, если вы просто хотите добавить число, вы, вероятно, просто хотите собрать свои объекты в массив. Однако, если вам нужна более сложная схема именования, возможно, вам подойдет один или несколько уровней хэшей.

Если у вас был способ извлечь имя из данных объекта после его формирования, и у вас был метод с именем name, вы могли бы сделать это:

my %object_map 
    = map { my $o = MyClass->new( $_ ); ( $o->name => $o ); } @data_array
    ;
2 голосов
/ 05 марта 2012

Я думаю, вы должны использовать некоторый хеш или массив для хранения объектов.

foreach $ref (@arrayref)
{
     push @array, myClass->new($ref);
     $hash{$key++} = myClass->new($ref);
}

, таким образом, вы можете получить к ним доступ с помощью $array[42] или $hash{42}.

1 голос
/ 05 марта 2012

Я согласен с Ade YU и Эриком Стромом и получил +1 ответ: вы должны использовать один из их подходов. Но то, что вы спрашиваете , технически возможно , используя символические ссылки, поэтому для полноты:

foreach my $i (0 .. $#arrayref)
{
    no strict refs;
    my $varname = 'array' . ($i + 1);
    ${$varname} = myClass->new($arrayref[$i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...