2012-02-09 12 views
2

私は3次元配列のセルを選択し、別の3次元配列への参照であるデータを読み書きするアルゴリズムを持っています。それを「ミニクラフト」アルゴリズムと考えてください。 問題は、このように動作するPerlでデータ構造を作る方法がわかりません:@ 3darray(x、y、z)=値 私を助けてくれますか?Perlで3D配列を正しく作成してループする方法は?

+2

コピーチャンクになりPerlデータ言語の微風(PD L)。しかし、PDLはリストのリストではなくcスタイルの配列を使います。 – zpmorgan

+0

それは非常に良い発見です、私はそれを調べます。 – AlfredoVR

答えて

7

私が正しく理解していれば:

use Data::Dumper; 

my ($x, $y, $z) = (1, 2, 3); 
my @array = map [map [map 0, 1..$z], 1..$y], 1..$x; 

print Dumper \@array; 

出力:Perlはautovivificationを通じてあなたのためにそれを作成するので

$VAR1 = [ 
      [ 
      [ 
       0, 
       0, 
       0 
      ], 
      [ 
       0, 
       0, 
       0 
      ] 
      ] 
     ]; 

しかし、事前にこのような構造を作る必要は(さらに下リファレンスを参照してください)、ありません

use Data::Dumper; 

my @array; 
$array[0][0][2] = 3; 

print Dumper \@array; 

出力:あなたは、ネストされた構造内の要素にアクセスするとそれ以外の場合は

for my $i (0 .. $#array) { 
    for my $j (0 .. $#{$array[$i]}) { 
     for my $k (0 .. $#{$array[$i][$j]}) { 
      print "$i,$j,$k => $array[$i][$j][$k]\n"; 
     } 
    } 
} 

:あなたは、インデックスが必要な場合は、ループについては

autovivification 

A Greco-Roman word meaning "to bring oneself to life". In Perl, storage locations 
(lvalues) spontaneously generate themselves as needed, including the creation of 
any hard reference values to point to the next level of storage. The assignment 
$a[5][5][5][5][5] = "quintet" potentially creates five scalar storage locations, 
plus four references (in the first four scalar locations) pointing to four new 
anonymous arrays (to hold the last four scalar locations). But the point of 
autovivification is that you don't have to worry about it. 

、::

$VAR1 = [ 
      [ 
      [ 
       undef, 
       undef, 
       3 
      ] 
      ] 
     ]; 

perlglossaryからボクセル世界の

for (@array) { 
    for (@$_) { 
     for (@$_) { 
      print "$_\n"; 
     } 
    } 
} 
+0

ありがとう、RTFMを手に入れていないのは素晴らしいことですが、あなたは私に非常に良い答えをくれました。また、私はちょうど新しい3D配列への参照を格納する場合、私はちょうどこれを行うだろうか? $ outer [$ x] [$ y] [$ z] =([] [$ x2] [$ y2] [$ z2] = $ value); ?うん、ちょっと狂ったよ:P – AlfredoVR

+0

'@ outer'を6D配列にすることや、別の3D配列を' @ outer'に深くコピーすることを効果的に意味するのでしょうか? – flesk

+0

私はすでにこのメソッドを使ってそれを解決しました。新しい3D配列のリファレンスを保存するだけです。 – AlfredoVR

関連する問題