In Perl, all arrays are one-dimensional, but the values in each dimension can be references to other arrays. We use the term multi-dimensional loosely.
If you have ever used a spreadsheet, you know what a 2-dimensional array looks like.
In a spreadsheet, you refer to a cell using the row and column labels.
Sounds like a Cartesian plane from geometry, where you use x and y to specify a point on the plane.
In our previous arrays, we referred to an element in the array using a single index into the array: $array[7]
Think of those arrays as only having 1 column (or 1 row if that's easier) - thus we only need 1 index.
So it should come as no surprise that we refer to an element in a 2-dimensional array like this: $array[7][9]
What does a 2-dimensional array look like?
my @foodstuff = ( ["asparagus","sprouts","peas","beans"], ["milk","coffee","juice","tea"], );
Using our knowledge of 1-dimensional arrays, how would we refer to sprouts in this array? (remember starting at 0)
If you said $foodstuff[0][1] then you get a plateful of them!
print "Do you like $foodstuff[0][1]?\n";
Each row is indexed starting at 0
Each element of each row is indexed starting at 0
Therefore, this 2-dimensional array is actually an array of arrays.
To print the whole array:
for my $outerloop (0 .. 1) { for my $innerloop(0 .. 3) { print "$foodstuff[$outerloop][$innerloop], "; } print "\n"; }
One thing of note is that we had to specify the number of rows and the number of elements in our code. But what if we don't know either?
my @foodstuff = ( ["apples","oranges","peaches","pears"], ["ham","chicken","beef","liver","fish","venison"], ["potatos","celery","carrots","corn"], ["asparagus","sprouts","peas","beans"], ["milk","coffee","juice","tea","wine"], );
This is where we use a reference to the array: @$.
for my $row (@foodstuff) { print "@$row\n"; }
Or using subscripts (indices):
for my $i (0 .. $#foodstuff) { print "Row $i: @{$foodstuff[$i]}\n"; }
Finally, using an inner and outer loop:
for my $i (0 .. $#foodstuff) { for my $j (0 .. $#{$foodstuff[$i]} ) { print "Item $i $j: $foodstuff[$i][$j]\n"; } }
We saw the use of $# before for finding the length of an array. We used it again in these examples in our loops.
Arrays are not limited to 2 dimensions - we can have multiple dimensions, as long as we can design, build, and maintain the memory structure.
Next ... Unique stuff