To supplement the answer by LanX, there are two ways to fill an array or hash: Either you initialize it with all values at once or you insert values one at a time. You seem to mix up these two methods. Here is how both work for arrays and hashes:
# initialize an array at once with 3 scalars, two array pointers and o
+ne hash pointer:
@array= (1,2,3,\@anotherarray,[1,2],{1=>15});
# initialize a hash at once with three keys. Data is one scalar, one h
+ash pointer and one array pointer
%hash= (1=>15, 7=>{5=>4}, 2=>[1,2,3]);
As you can see initializing at once is not complicated, you just have to remember that hash and array are both initialized with an array constant that uses (), but constant array pointers are specified with [] and constant hash pointers are specified with {}. Also any old values are completely erased so this doesn't work when you want to add values one by one
Inserting values one at a time (mostly in a loop) on the other hand uses the same "interface" as any normal array or hash operation, so:
foreach ... {
$array[$i][$j]= $value;
# or
push( @{$array[$i]}, $value);
$hash{$i}{$j}= $value;
}
Since only one value inside the array or hash is changed or added and all other values remain, this works very well in a loop