it-swarm.com.ru

Как я могу создать многомерный массив в Perl?

Я немного новичок в Perl, но вот что я хочу сделать: 

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

Он не компилируется, так как @array2d[$i] не массив, а скалярное значение.

Как мне объявить @ array2d как массив массивов?

Конечно, я понятия не имею, сколько у меня строк.

18
Ben

Чтобы сделать массив массивов или, точнее, массив arrayrefs, попробуйте что-то вроде этого: 

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

Он помещает значение в разыменованный массив для вас. Вы должны быть в состоянии получить доступ к записи, как это: 

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

Измените свою строку "Push" на это:

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

Другой простой способ - использовать хеш-таблицу и использовать два индекса массива для создания хеш-ключа:

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