Μια μεταβλητή μπορεί να είναι defined (ορισμένη) ή undefined (αόριστη). Όταν δηλώνουμε my $input αλλά δεν έχουμε δώσει καμία τιμή στην $input τότε αυτή είναι undefined. Αν λοιπόν δώσουμε print "$input\n" θα τυπωθεί απλώς ένα κενό.
Μερικές φορές είναι χρήσιμο να γνωρίζουμε αν η μεταβλητή μας είναι defined ή undefined πράγμα που επιτυγχάνεται με τη συνάρτηση defined.
my $input;
if (defined $input)
{
κάνε κάτι (π.χ.. print "\$input is defined\n")
}
Αν η $input είναι defined (δηλαδή έχει κάποια τιμή), τότε θα εκτελεστεί το περιεχόμενο των αγκίστρων.
if (!defined $input)
{
print "\$input is undefined\n";
}
Αν η $input δεν είναι defined (είναι δηλαδή undefined και δεν έχει κάποια τιμή), τότε θα εκτελεστεί το περιεχόμενο των αγκίστρων. (Υπενθυμίζουμε ότι το ! είναι λογικός τελεστής και σημαίνει not)
Ας δούμε τώρα την ακόλουθη περίπτωση:
my @my_array = ('a', 'b', 'c');
$my_array[9] = 'd';
print "@my_array\n";
Το αποτέλεσμα που θα λάβουμε από την εκτύπωση είναι:
Use of uninitialized value in join or string at now.pl line 5.
Use of uninitialized value in join or string at now.pl line 5.
Use of uninitialized value in join or string at now.pl line 5.
Use of uninitialized value in join or string at now.pl line 5.
Use of uninitialized value in join or string at now.pl line 5.
Use of uninitialized value in join or string at now.pl line 5.
a b c d
Η Perl μεγάλωσε την @my_array και τοποθέτησε την τιμή d στη δέκατη θέση (μην ξεχνάτε ότι στις arrays αρχίζουμε να μετράμε από το 0). Μεταξύ όμως του c (της τρίτης τιμής) και του d δεν υπήρχε τίποτε. Έτσι η Perl τοποθέτησε 6 undefined τιμές που όμως δεν κατάφερε να τυπώσει όταν χρειάστηκε να ενώσει ολόκληρη την @my_array σε ένα string για να την τυπώσει. (Γενικά, όταν συναντάτε το μήνυμα λάθους uninitialized value σημαίνει ότι ζητήσατε από την Perl να διαχειριστεί κάτι που δεν υπάρχει π.χ. της λέτε να βρει κάτι άλλο από αυτό που υπάρχει.)
Ένα μικρό πρόγραμμα θα μας δείξει ποιες τιμές της array που μας ενδιαφέρει είναι defined και ποιες όχι:
my @my_array = ('a', 'b', 'c');
$my_array[9] = 'd';
my $count = 0;
Φτιάχνουμε έναν counter και τον ξεκινούμε από την τιμή 0.
my $quit = 5;
Θα χρησιμοποιήσουμε μια while και δίνουμε την τιμή για την οποία αυτή θα πρέπει να εκτελείται (θα μπορούσα να βάλω $quit = 1 όπως και στα προηγούμενα παραδείγματα, αλλά δεν θέλω να συνηθίσετε και να νομίζετε ότι αυτό είναι υποχρεωτικό).
my $length = @my_array;
Ο αριθμός των περιεχομένων της @my_array αποθηκεύεται στη $length. (Εδώ ο αριθμός αυτός είναι 10, δηλαδή υπάρχουν 10 τιμές μέσα στην @my_array.)
while ($quit == 5)
{
if (defined $my_array[$count])
{
print "Position \[$count\] is defined\n";
}
Φανταστείτε ότι είστε η Perl και τρέχετε για πρώτη φορά αυτή τη while. Θα ελέγξετε το περιεχόμενο της $my_array[0] και θα τυπώσετε την πληροφορία ότι είναι defined αν αυτό όντως ισχύει.
else
{
print "Position \[$count\] is undefined\n";
}
Αν η $my_array[0] είναι undefined θα τυπώσετε αυτή την πληροφορία.
$count++;
Αυξάνουμε την $count κατά 1. (Αν βρισκόμαστε στο πρώτο πέρασμα τότε η τιμή της από 0 γίνεται 1.)
if ($count == $length)
{
$quit = 4;
}
Αν η $count είναι 1 τότε το if δεν ισχύει και ξαναρχίζουμε από την αρχή ελέγχοντας αν είναι defined η $my_array[1].
Όταν η $count γίνει 10 (το μέγεθος της $length) αυτό σημαίνει ότι έχουμε ήδη ελέγξει τα [0], [1] ,[2] ,[3] ,[4] ,[5] ,[6] ,[7] ,[8] , [9], δηλαδή ολόκληρο το περιεχόμενο της @my_array. Το loop λοιπόν μπορεί να τερματιστεί.
}
Η εκτύπωση του προγράμματος αυτού θα μας δώσει:
Position [0] is defined
Position [1] is defined
Position [2] is defined
Position [3] is undefined
Position [4] is undefined
Position [5] is undefined
Position [6] is undefined
Position [7] is undefined
Position [8] is undefined
Position [9] is defined