Μέχρι τώρα χρησιμοποιήσαμε για τα προγράμματά μας μόνο μεμονωμένες τιμές (scalar variables). Για παράδειγμα, δηλώναμε $foo = 'Γιώργος ' και η Perl καταλάβαινε ότι η μεταβλητή $foo έχει την τιμή 'Γιώργος'.
Πολλές φορές όμως θέλουμε να διαχειριστούμε σειρές από πολλές τιμές (arrays) και δεν θα ήταν καθόλου πρακτικό να θεωρήσουμε κάθε τιμή ως μια ξεχωριστή scalar variable.
Για παράδειγμα μπορεί να θέλουμε να διαχειριστούμε μια λίστα από θερμοκρασίες (25, 27, 26, 29, 27, 27, 28), έναν αριθμό από αρχεία (whatnew.htm, whatnew2.htm, what.htm) κ.λπ. Ολόκληρη αυτή τη σειρά δεδομένων τη συμβολίζουμε στην Perl ως μια array variable. Οι μεταβλητές αυτές μπορούν να έχουν όποιο όνομα επιθυμούμε και ξεχωρίζουν από τις scalar variables διότι ο πρώτος χαρακτήρας αντί για $ είναι @. Το όνομα της array πρέπει να είναι μικρότερο από 255 χαρακτήρες και να αποτελείται μόνο από γράμματα, αριθμούς και το χαρακτήρα underscore (_). Αντίθετα από τις scalars το όνομα μιας array μπορεί να αρχίζει από αριθμό, αλλά τότε θα περιέχει υποχρεωτικό μόνο αριθμούς.
Μια άδεια array ορίζεται ως: @empty =();
Ας δούμε ένα μικρό παράδειγμα γεμάτων arrays:
@only_a_list = (8, 9, 10);
Η λίστα αυτή αποτελείται από τις τιμές 8, 9 και 10. Όπως όμως αναφέραμε παραπάνω λίστα για την Perl σημαίνει σειρά δεδομένων. Τα περιεχόμενά της λοιπόν δεν είναι περιορίζονται μόνο σε αριθμούς:
my $test= 7;
@only_a_list = (8, 9, 10);
@just_a_list = (7, 'giorgos', 7+4, @only_a_list, 'hellow world', "this is a
test", $test);
print "@just_a_list\n";
Η εκτύπωση της @just_a_list θα μας δώσει:
7 giorgos 11 8 9 10 hellow world this is a test 7
Παρατηρούμε ότι:
- Το giorgos όπως και το hellow world ή το this is a test τυπώθηκαν χωρίς τα εισαγωγικά ή τις αποστρόφους τους ('' ή "").
- To 7+4 έγινε 11 (η Perl έκανε αυτόματα την πρόσθεση)
- Μέσα στην @just_a_list περιλάβαμε τη σειρά @only_a_list. Η Perl μπορεί να δεχθεί σειρές μέσα σε άλλες σειρές και διαχειρίζεται το τελικό αποτέλεσμα ως μια μεγάλη σειρά. Έτσι, το @only_a_list αντικαταστάθηκε από τα περιεχόμενά του: 8 9 10
- Μια σειρά μπορεί να περιέχει και scalar variables (στο παράδειγμά μας την $test) και «καταλαβαίνει» αυτόματα ποιο είναι το περιεχόμενό τους (στην προκειμένη περίπτωση το 7)
Αν και οι αριθμοί δηλώνονται στην Perl χωρισμένοι απλώς με κόμματα (π.χ. 8, 9, 10) οι λέξεις δηλώθηκαν στη λίστα χωρισμένες με εισαγωγικά ή αποστρόφους ('' ή ""). Αν δοκιμάσουμε να βάλουμε το giorgos χωρίς αποστρόφους ή εισαγωγικά:
@just_a_list = (7, giorgos, 7+4, @only_a_list, 'hellow world', "this is a
test", $test);
τότε αν η Perl που λειτουργεί υπό συνθήκες «αυστηρής» σύνταξης (use strict) δεν θα εκτελέσει το πρόγραμμά μας διαμαρτυρόμενη επειδή χρησιμοποιήσαμε μια "bareword" (μια λέξη χωρίς δηλωτικά σύμβολα που να ορίζουν πού αρχίζει και πού τελειώνει). Επειδή λοιπόν εμείς είμαστε οπαδοί της αυστηρής σύνταξης (για να αποφεύγουμε τα λάθη) φροντίζουμε να μην υπάρχουν ποτέ bareworlds στις λίστες μας.
Αυτό δυστυχώς είναι πρόβλημα όταν θέλουμε να δηλώσουμε πολλές από αυτές. Για να γλιτώσουμε λοιπόν τον μπελά της πληκτρολόγησης εισαγωγικών ή αποστρόφων (και να αποφύγουμε τον κίνδυνο να ξεχάσουμε κάτι) χρησιμοποιούμε τη συνάρτηση qw. Το:
my @word_test = qw(Ιανουάριος Φεβρουάριος Μάρτιος Απρίλιος);
είναι ισοδύναμο ως έκφραση με το:
my @word_test = ('Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος');
Σημειώστε επίσης ότι εκτός από παρενθέσεις η qw λειτουργεί και με // ή ||.
Όλες οι παραπάνω εκφράσεις δοκιμάστηκαν με το ακόλουθο παράδειγμα:
#!/usr/bin/perl -w
use strict;
my @only_a_list;
my @just_a_list;
my $test= 7;
my @word_test = qw/Ιανουάριος Φεβρουάριος Μάρτιος Απρίλιος/;
@only_a_list = (8, 9, 10);
@just_a_list = (7, 'giorgos', 7+4, @only_a_list, 'hellow world', "this is a
test", $test);
print "@just_a_list\n";
print "@word_test\n";
Επιστροφή στην Κορυφή
Range - assignment
Η Perl μας προσφέρει έναν εύκολο τρόπο δημιουργίας arrays με σειρές γραμμάτων ή αριθμών:
my @number_array = (25 .. 48);
Θα δημιουργήσει μια array με περιεχόμενα τις τιμές από το 25 έως και το 48.
my @letter_array = ('a' .. 'y');
Θα δημιουργήσει μια array με περιεχόμενα τα γράμματα από το a έως και το y (με αλφαβητική σειρά φυσικά).
Για όσους τώρα αναρωτιούνται ποια η διαφορά ανάμεσα σε λίστα και array, ας δούμε το ακόλουθο παράδειγμα:
($foo, $bar, $oof, $rab) = ( 1, 2, 3, 4 );
Εδώ έχουμε δύο λίστες και η δεύτερη δίνει τιμές στις μεταβλητές της πρώτης (το $foo γίνεται 1, το $bar γίνεται 2 κ.ο.κ.).
($foo , $bar) = ($bar, $foo);
Εδώ οι τιμές των μεταβλητών της αριστερής λίστας ανταλλάσσονται (η $foo παίρνει την τιμή της $bar και αντιστρόφως). Η σύνταξη αυτή μπορεί να λειτουργήσει και για περισσότερες από δύο μεταβλητές και η Perl καταφέρνει να κάνει τις αντιμεταθέσεις τιμών χωρίς να χαθεί ή να μπερδευτεί τίποτε.