如何从数组中的每个元素创建对象?

时间:2012-03-05 18:19:20

标签: arrays perl reference module

我有一个带有新构造函数的模块:

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 个答案:

答案 0 :(得分:5)

如果使用复数数据结构(数组),则需要将结果存储到多个容器(或多个标量容器)中。执行此操作的惯用方法是使用map函数:

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

如果你知道@source_array包含固定数量的项目,并且你想要每个对象的标量:

my ($foo, $bar, $baz) = map {myClass->new($_)} @source_with_3_items;

答案 1 :(得分:2)

我认为你应该使用一些哈希或数组来包含对象。

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

因此您可以使用$array[42]$hash{42}

访问它们

答案 2 :(得分:2)

$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
    ;

答案 3 :(得分:2)

你是否正在尝试这样做?

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;

答案 4 :(得分:1)

我同意Ade YU和Eric Strom,他们的回答是+1:你应该使用他们的一种方法。但是你要求 在技术上是可行的,使用符号引用,所以为了完整性:

foreach my $i (0 .. $#arrayref)
{
    no strict refs;
    my $varname = 'array' . ($i + 1);
    ${$varname} = myClass->new($arrayref[$i]);
}