2013-09-06 4 views
0

Я пытаюсь нажать/unshift 1D-массив в 2D-массиве, который является подматрицей 3D-массива. Вы можете проверить пример кода в http://codepad.org/5s8Og64k, чтобы сделать это более ясным, я копирую его и здесь:Perl: Нажатие 1d массива в 3d-поддиапазон

use Data::Dumper; 

# @arr_3d ; 
$arr_3d[0][0][0] = 1; 
$arr_3d[0][1][0] = 2; 
$arr_3d[0][0][1] = 4; 
$arr_3d[0][1][1] = 3; 
# @arr_1d ; 
$arr_1d[1] = "new1"; 
$arr_1d[0] = "new0"; 

print Dumper(\@arr_3d); 
unshift @{$arr_3d[0]},\@arr_1d; 
print Dumper(\@arr_3d); 

Другими словами, если мы определяем размеры хуг 3D-массива и рассмотрим х постоянная, то мы получим «2D» массив. Я хочу подтолкнуть массив 1D в этот «поддиапазон» 2D исходного массива 3D.

Пример кода на самом деле, что НО когда я пытаюсь применить его к моему основному сценарию, самосвал отвалов «$ VAR1 -> [0] [0]» на месте всех ранее pushed- в данных, и только сбрасывает данные из последнего вдавленного массива 1D.

Любая идея, что может быть причиной этого или более эффективного способа сделать толкание, которое я описываю?

Дополнительно: Фактическая структура данных создается в цикле, что-то вроде:

unshift @{$arr_3d[$index]},\@arr_1d; 
print @arr_1d; # This prints successfully the 1D array 

где "@ arr_1d" создается быть просто присваивающих отдельных элементов:

$arr_1d[0]='a'; $arr_1d[1]='b'; # etc, etc.. 

Спасибо за ваше время, Giorgos

+0

Ну, как вы строите фактическая структура данных? Есть ли у него петли? – amon

+0

Я добавил информацию для создания фактической структуры данных в конце сообщения. Спасибо за ваш интерес. – user2405602

ответ

3

Array не может содержать массивы. Поэтому мы помещаем ссылки на массивы в массивы.

unshift @a, \@arr_1d; 
      ^
      | 

В «основной сценарий», вы ставите две ссылки на тот же массив

my @arr_1d; 
for (...) { 
    ... 
    unshift @a, \@arr_1d; 
} 

Это, как правило, решается путем определения объема в my переменную таким образом он получает выполняется два раза, и, таким образом, создать две переменные ,

for (...) { 
    my @arr_1d; 
    ... 
    unshift @a, \@arr_1d; 
} 

Другой альтернативой является использование [] для создает анонимный массив, когда это необходимо. ([ ... ] похож на do { my @anon = (...); \@anon }.)

my @arr_1d; 
for (...) { 
    ... 
    unshift @a, [ @arr_1d ]; 
} 
+0

Благодарим вас за то, что вы решили мою проблему и научили меня чему-то новому. Действительно из вас! – user2405602

Смежные вопросы