[eeei.gr Logo]
Επικοινωνία
Ταυτότητα
Μαθήματα Internet | Μαθήματα Προγραμματισμού | Net Business | Τα νέα του Internet | Ο Κόσμος του Αύριο

Εισαγωγή στο scope

Το παρακάτω πολύ απλό πρόγραμμα καλεί μια υπορουτίνα (ένα υποπρόγραμμα) και το εκτελεί:

&justaroutine;

sub justaroutine

{

my $test = 'Dokimi';

print "$test\n";

}

Αν όμως το πρόγραμμα ήταν:

&justaroutine;

sub justaroutine {

my $test = 'Dokimi';

}

print "$test\n";

Θα λαμβάναμε (αν χρησιμοποιούσαμε τη use strict) το μήνυμα:

Global symbol "$test" requires explicit package name at now.pl line 7.

Execution of now.pl aborted due to compilation errors.

Αυτό που συνέβη είναι ότι προσπαθήσαμε να τυπώσουμε από το κυρίως πρόγραμμα μια μεταβλητή την $test η οποία ορίστηκε μέσα στο υποπρόγραμμα. Για την Perl κάθε μεταβλητή υπάρχει και έχει ισχύ μόνο για το δικό της block ({}) και όσα βρίσκονται μέσα σε αυτό, αλλά όχι για τα ανώτερα. Λέμε λοιπόν ότι το πρόγραμμα δεν μπορεί να λειτουργήσει γιατί η εκτύπωση κάλεσε μια μεταβλητή έξω από το scope (το εύρος ισχύος) της.

Το ακόλουθο πρόγραμμα όμως θα λειτουργήσει σωστά:

my $test = "Dokimi";

&justaroutine;

sub justaroutine {

print "$test\n";

}

Εδώ η $test βρίσκεται έξω από την υπορουτίνα, άρα μπορεί να κληθεί και να χρησιμοποιηθεί κανονικά.

Σημειώστε πάντως ότι το θέμα του scope έχει εφαρμογή σε κάθε block και όχι μόνο σε υπορουτίνες. Για παράδειγμα, μια μεταβλητή που ορίστηκε μέσα σε ένα while, for, foreach κ.λπ. (οτιδήποτε περικλείεται από άγκιστρα) δεν είναι αναγνωρίσιμη έξω από αυτό. Επίσης, αν μια μεταβλητή έχει οριστεί ως global (είναι εκτός κάποιου block και ισχύει για όλο το πρόγραμμα), αλλά ορίσουμε μέσα σε κάποιο block μια άλλη μεταβλητή με το ίδιο όνομα, τότε η τελευταία θα έχει ισχύ μέσα σε αυτό το block και η άλλη οπουδήποτε αλλού. Τέτοιες πρακτικές όμως καλό είναι να αποφεύγονται, γιατί είναι εύκολο να μπερδευτούμε και να κάνουμε λάθη.


Τρέχουσα Ενότητα: Perl


 

Φιλικά - συνεργαζόμενα sites: Left Handed Products


© Eeei.gr 2009