web-dev-qa-db-ja.com

Perlで多次元配列を作成するにはどうすればよいですか?

私はPerlに少し慣れていませんが、これが私がやりたいことです:

my @array2d;
while(<FILE>){
  Push(@array2d[$i], $_);
}

@array2d[$i]は配列ではなくスカラー値であるため、コンパイルされません。

@ array2dを配列の配列としてどのように宣言する必要がありますか?

もちろん、行数はわかりません。

18
Ben

配列の配列、より正確にはarrayrefの配列を作成するには、次のようにしてみてください。

my @array = ();
foreach my $i ( 0 .. 10 ) {
  foreach my $j ( 0 .. 10 ) {
    Push @{ $array[$i] }, $j;
  }
}

値を逆参照されたarrayrefにプッシュします。次のようなエントリにアクセスできるはずです。

print $array[3][2];
27
gpojd

「プッシュ」行を次のように変更します。

Push(@{$array2d[$i]}, $_);

基本的に、$ array2d [$ i]を@ {}で囲むことによって配列を作成しています...次に、この配列参照の配列に要素をプッシュできます。

8
BrianH

perlref および perldsc を見て、配列の配列やハッシュのハッシュなど、ネストされたデータ構造を作成する方法を確認してください。 Perlをしているときに非常に便利なもの。

6
Paul Tomblin

あなたが書いたものとこれとの間に実際には違いはありません:

@{$array2d[$i]} = <FILE>;

私はあなたがファイルを反復していると仮定することしかできません。

カウンターの追跡を回避するには、次のようにします。

...
Push @array2d, [ <FILE> ];
...

つまり、1)空の配列への参照を作成し、2)すべての行をFILEに格納し、3)それを@array2dにプッシュします。

3
Axeman

ファイルを配列に格納しようとしているだけの場合は、次のこともできます。

fopen(FILE,"<somefile.txt");
@array = <FILE>;
close (FILE);
0
slm

もう1つの簡単な方法は、ハッシュテーブルを使用し、2つの配列インデックスを使用してハッシュキーを作成することです。

$two_dimensional_array{"$i $j"} = $val;
0
Nathan Fellman