2012-03-05 157 views
2

我有一個新的構造模塊:如何從數組中的每個元素中創建對象?

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

如果您使用複數數據結構(數組),那麼您需要將結果存儲到多個容器(或多個標量容器)中。該idomatic方式做,這是使用map功能:如果你知道@source_array包含項目的固定數量

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

,並且要爲每個對象的標量:

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

因此我的@object_array = map {myClass-> new($ _)} @source_array;將是我的對象的數組? 我將如何調用某個對象的功能? – user1224478 2012-03-05 19:17:07

+0

您可以通過數組中的索引訪問每個元素:'$ object_array [2] - > some_method(...)' – 2012-03-05 19:20:42

2

我認爲你應該使用一些散列或數組來包含對象。

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

因此,您可以用$array[42]$hash{42}訪問它們。

1

我同意Ade YU和Eric Strom,併爲他們的答案+1:你應該使用他們的一種方法。但是你問是什麼技術上是可行的,使用符號引用,所以爲了完整性:

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

Ya。好答案。究竟是提問者需要什麼。希望提問者知道這不是好的做法。 – 2012-03-05 18:37:24

+0

@downvoter:謹慎解釋? – ruakh 2012-03-05 20:04:20

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 
    ; 
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; 
相關問題