2012-03-05 11 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

複数のデータ構造(配列)を扱う場合、結果を複数のコンテナ(または複数のスカラーコンテナ)に格納する必要があります。

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

私の@object_array = map {myClass-> new($ _)} @source_array;私のオブジェクトの配列になりますか? はどのようにして、特定のオブジェクトの関数を呼び出すでしょうか? – user1224478

+0

配列内のインデックスで各要素にアクセスします: '$ object_array [2] - > some_method(...)' –

2

オブジェクトを含めるには、ハッシュまたは配列を使用する必要があります。

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

ので、あなたは$array[42]または$hash{42}でそれらにアクセスすることができます。

1

私は同意する:あなたは@source_arrayは、一定の項目数が含まれている、とあなたが各オブジェクトのスカラをしたいことがわかっている場合

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

:これを行うにはidomatic方法はmap機能を使用することですAde YUとEric Stromが答えてくれました。彼らのアプローチの1つを使うべきです。

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

いい答えだ。質問者が必要とするものとまったく同じです。質問者がそれが良い習慣ではないことを知りたがっていれば幸いです。 –

+0

@downvoter:気をつけて説明しますか? – ruakh

2

$array[1]$array1の間には違いは基本的にありません。しかし、あなたはを尋ねることは完全ためになるよう、シンボリックリファレンスを使用して、技術的に可能です。 「つなぎ合わせ」と、$array1ができない現代のPerl環境の下ですることができる$array[1]中のプログラムの違いがあります。したがって、私は有効な$xのために$array[$x]と書くことができ、$array.$xという "仮想名"を持つアイテムを得ることができます。

このように、数字を追加するだけであれば、配列内のオブジェクトを収集したいと思うかもしれません。しかし、より複雑な命名体系が必要な場合は、おそらく1つ以上のレベルのハッシュが良い方法でしょう。

一度形成された物体データから名前を導出する方法があったが、この方法は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; 

ただし、そのような変数を再利用しないでください。

関連する問題