Как я могу создать многомерный массив в Perl? - PullRequest
18 голосов
/ 25 ноября 2008

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

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

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

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

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

Ответы [ 6 ]

27 голосов
/ 25 ноября 2008

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

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

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

print $array[3][2];
8 голосов
/ 25 ноября 2008

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

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

Вы в основном делаете массив $ array2d [$ i] массивом, окружая его @ {} ... Затем вы можете помещать элементы в этот массив ссылок на массив.

6 голосов
/ 25 ноября 2008

Посмотрите на perlref и perldsc , чтобы узнать, как создавать вложенные структуры данных, такие как массивы массивов и хэши хэшей. Очень полезная вещь, когда вы делаете Perl.

3 голосов
/ 25 ноября 2008

На самом деле нет никакой разницы между тем, что вы написали, и этим:

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

Я могу только предположить, что вы просматриваете файлы.

Чтобы не отслеживать счетчик, вы можете сделать следующее:

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

Это говорит: 1) создать ссылку на пустой массив, 2) сохранить все строки в FILE, 3) вставить его в @array2d.

0 голосов
/ 28 июля 2011

Если вы просто пытаетесь сохранить файл в массиве, вы также можете сделать это:

fopen(FILE,"<somefile.txt");
@array = <FILE>;
close (FILE);
0 голосов
/ 25 ноября 2008

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

$two_dimensional_array{"$i $j"} = $val;
...