Μια array δεν αποτελεί απλώς ένα σύνολο από scalar μεταβλητές, αλλά μπορεί να περιέχει ως στοιχεία της άλλες πλήρεις arrays. Για παράδειγμα:
my @AinA = (
['Luke', 'Anakin', 'Shmi' ],
['Yoda', 'Obi Wan Kenobi'],
['Sidious', 'Maul', 'Vader']
);
Η AinA είναι μια array αποτελούμενη από τρία στοιχεία κάθε ένα από τα οποία είναι και μια ξεχωριστή array. Λέμε λοιπόν ότι η AinA αποτελεί μια δισδιάστατη array (ονομάζεται και matrix). Όπως φαντάζεστε δεν υπάρχει λόγος να περιοριστούμε σε δισδιάστατες arrays, αλλά μπορούμε να προσθέσουμε και περισσότερες διαστάσεις.
print "$AinA[0][1] \n";
Εδώ ζητούμε την εκτύπωση του δεύτερου στοιχείου της πρώτης array. Δηλαδή του Anakin.
print "$AinA[1][1] \n";
Εδώ ζητούμε την εκτύπωση του δεύτερου στοιχείου της δεύτερης array. Δηλαδή του Obi Wan Kenobi.
Φυσικά στις περισσότερες περιπτώσεις η πρόσθεση τιμών σε μια πολυδιάστατη array δεν θα γίνεται με πληκτρολόγηση με το χέρι όπως στο παραπάνω παράδειγμα, αλλά αυτόματα. Ας υποθέσουμε ότι διαθέτουμε το αρχείο droids.txt με το ακόλουθο περιεχόμενο:
C-3PO:Tatooine:protocol droid:Rebel Alliance
R2-D2:Naboo:astromech droid:Rebel Alliance
FX-7:N/A:Medical assistant:Rebel Alliance
IT-O:Empire:Interrogator droid:Empire
droideka:Colicoids:Destroyer droid:Trade Federation
Πρόκειται για ένα text delimited αρχείο όπου κάθε γραμμή αναφέρεται σε ένα ξεχωριστό robot (droid) απ όσα εμφανίζονται στο Star Wars. Τα χαρακτηριστικά που περιλαμβάνει κάθε γραμμή είναι όνομα, προέλευση, ειδικότητα και οργανισμός που το χρησιμοποιεί. Μεταξύ των χαρακτηριστικών χρησιμοποιείται ο χαρακτήρας : για να τα ξεχωρίζει (delimiter).
Αυτό που θέλουμε είναι να δημιουργήσουμε μια array που κάθε τιμή της να είναι και μια ξεχωριστή array με όλα τα δεδομένα ενός droid. Με άλλα λόγια θέλουμε να δημιουργήσουμε το:
@droid_data = (
['C-3PO','Tatooine','protocol droid','Rebel Alliance']
['R2-D2','Naboo','astromech droid','Rebel Alliance']
['FX-7','N/A','Medical assistant','Rebel Alliance']
['IT-O','Empire','Interrogator droid','Empire']
['droideka','Colicoids','Destroyer droid','Trade Federation']
);
Θέλουμε όμως η εργασία να γίνει αυτόματα μια και συνήθως τα δεδομένα μας θα είναι πάρα πολλά για να πληκτρολογηθούν με το χέρι από την αρχή. Ο κώδικας για να επιτευχθεί η αυτόματη εισαγωγή είναι:
open (STAR_WARS_DROIDS, 'droids.txt') or die "can't open droids.txt $!";
my @droid_data;
while (<STAR_WARS_DROIDS>)
Ανοίξαμε το αρχείο και με μια while αρχίζουμε να το διαβάζουμε γραμμή γραμμή.
{
my @temp = split (/:/, $_);
Δημιουργούμε μια προσωρινή array με το όνομα @temp και κάνουμε split τα δεδομένα κάθε γραμμής έτσι ώστε να «μπουν» στην @temp ως ξεχωριστά στοιχεία. Για παράδειγμα η πρώτη @temp θα είναι η '9C-3PO','Tatooine','protocol droid','Rebel Alliance').
push (@droid_data, [@temp]);
}
Κάθε @temp τοποθετείται ολόκληρη μέσα στην @droid_data. Όταν η while έχει επεξεργαστεί όλες τις γραμμές του αρχείου η @droid_data θα είναι πλήρης.
print "$droid_data[0][0] $droid_data[0][3] \n";
print "$droid_data[1][0] $droid_data[1][3] \n";
print "$droid_data[2][0] $droid_data[2][3] \n";
print "$droid_data[3][0] $droid_data[3][3] \n";
print "$droid_data[4][0] $droid_data[4][3] \n";
Η εκτύπωση αυτή θα μας δώσει τα ονόματα των droids και τον οργανισμό για τον οποίον λειτουργούν:
C-3PO Rebel Alliance
R2-D2 Rebel Alliance
FX-7 Rebel Alliance
IT-O Empire
droideka Trade Federation
Αυτό που δεν μπορούμε να κάνουμε είναι να τυπώσουμε ολόκληρη την @droid_data. Το print "@droid_data\n" θα μας δώσει:
ARRAY(0x177f100) ARRAY(0x177f1e4) ARRAY(0x1775598) ARRAY(0x1775628) ARRAY(0x1771e9c) ARRAY(0x1771ee4) ARRAY(0x1771efc) ARRAY(0x1771f14) ARRAY(0x176f44c) ARRAY(0x176f470) ARRAY(0x176f494)
Αυτές είναι οι παραπομπές (references) που τηρεί εσωτερικά η Perl για τα δεδομένα που διαχειρίζεται. Για να εκτυπώσουμε τα ίδια τα δεδομένα θα πρέπει να χρησιμοποιήσουμε ένα loop:
my $row;
for $row (@droid_data)
{
print "@$row\n";
}