我有一个带有新构造函数的模块:
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
等。 )
答案 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]);
}