ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ

Η Γλώσσα Προγραμματισμού Perl

    

Τι Είναι η Perl

Τα αρχικά PERL σημαίνουν Practical Extraction and Report Language. Η Perl είναι μια γλώσσα προγραμματισμού που αναπτύχθηκε από τον Larry Wall και σχεδιάστηκε ειδικά για την επεξεργασία κειμένου. Εξαιτίας των ισχυρών δυνατοτήτων επεξεργασίας κειμένου που διαθέτει, η Perl έχει γίνει μια από τις πιο δημοφιλείς γλώσσες για το γράψιμο των CGI scripts. Η Perl είναι μια διερμηνευόμενη γλώσσα (interpretive language) που σημαίνει ότι μπορούμε εύκολα να γράψουμε και να δοκιμάσουμε απλά προγράμματα.

 

Εισαγωγή στην Perl

Η Perl είναι διαθέσιμη δωρεάν στο Web και χρησιμοποιείται σε πολλές εφαρμογές, όπως το να γράψουμε CGI scripts που βοηθούν τους administrators στην συντήρηση των συστημάτων τους. Η Perl δημιουργήθηκε, και συντηρείται ακόμα, από τον Larry Wall. Είναι πιο αργή από την C, αλλά πιο γρήγορη από μια κανονική διερμηνευόμενη γλώσσα.

Ένα από τα πιο ωραία πράγματα σχετικά με την Perl είναι το ότι διατίθεται δωρεάν. Διανέμεται με την άδεια GNU license και ο πηγαίος κώδικάς της είναι διαθέσιμος από την αρχική ιστοσελίδα της Perl (Perl Home Page), την http://www.perl.com. Αυτό, σε συνδυασμό με το ότι είναι ευέλικτη και έχει πολύ λίγους περιορισμούς, κάνουν την Perl μια δημοφιλή γλώσσα. Ακόμα, υποστηρίζεται από πολλές πλατφόρμες όπως Unix, Windows και DOS.

 

Η Perl και το CGI

Αν έχετε ή σκοπεύετε να στήσετε το δικό σας Web site, θα έχετε ακούσει για τις τεχνολογίες HTML, Javascript, Java και CGI. Το CGI σημαίνει Common Gateway Interface και είναι κάτι διαφορετικό από τις τεχνολογίες Javascript, HTML και Client Side Java. Το CGI παρέχει μια στάνταρτ μέθοδο για προγράμματα που είναι γραμμένα σε μια οποιαδήποτε γλώσσα για να εκτελεσθούν στην πλευρά του server (server side) και να επικοινωνήσουν με το λογισμικό του server (Web server software) για απόκριση (response) στις αιτήσεις (requests) για ιστοσελίδες (Web pages). Μ’ άλλα λόγια, το CGI είναι το μέρος του Web site μας που επικοινωνεί με τα άλλα προγράμματα που εκτελούνται στον server.

Ο κύριος σκοπός που γράφουμε προγράμματα ή scripts CGI είναι για να υπάρχει περισσότερη αλληλεπιδραστικότητα (interactivity) στο Web site μας. Πολλά Web sites είναι στατικά και δεν επιτρέπουν πολύ αλληλεπίδραση με τον χρήστη (user interaction). Άλλα έχουν βιβλία επισκεπτών (guestbooks), image counters και μας δίνουν την δυνατότητα να κάνουμε παραγγελίες (orders), να έχουμε πρόσβαση σε βάσεις δεδομένων και άλλες χρήσιμες εφαρμογές.

Εδώ είναι που αναλαμβάνει δράση το CGI. Για να μπορέσουν να υλοποιηθούν αυτά τα είδη αλληλεπίδρασης (interactivity), θα πρέπει να υπάρχει μια εφαρμογή που να εκτελείται στον server η οποία να γνωρίζει πώς να επεξεργασθεί συγκεκριμένα είδη καταχωρήσεων του χρήστη. Τα CGI scripts μπορούν να γραφούν σε μια οποιαδήποτε γλώσσα, αλλά οι πιο κοινές είναι η Perl και η C. Η Perl προτιμάται για το γράψιμο των CGI scripts επειδή είναι πολύ ισχυρή στην επεξεργασία των strings. Και άλλες γλώσσες προγραμματισμού όπως η Java και η PHP είναι επίσης δημοφιλείς καθώς παρέχουν αλληλεπιδραστικότητα (interactivity) χωρίς την χρήση του CGI.

Ο προγραμματισμός σε CGI δεν είναι τίποτα παραπάνω από τον προγραμματισμό με κάποια ειδικά είδη εισόδου (input) και μερικούς πολύ αυστηρούς κανόνες για την έξοδο του προγράμματος (output). Όταν ένας χρήστης καταχωρεί στοιχεία σε μια φόρμα (form) ο server στέλνει τις καταχωρήσεις της φόρμας στο συγκεκριμένο πρόγραμμα CGI, το οποίο με την σειρά του αναλύει (parses) τα δεδομένα που εισήχθησαν και τα χρησιμοποιεί μ’ έναν συγκεκριμένο τρόπο και επιστρέφει τον HTML κώδικα με μια απάντηση στην αίτηση (request) του χρήστη.

Όταν πρέπει να επιλέξουμε μια γλώσσα στην οποία θα πρέπει να γράψουμε τα CGI scripts, πρέπει να βεβαιωθούμε ότι η γλώσσα που επιλέγουμε :

Η Perl ικανοποιεί όλες τις παραπάνω απαιτήσεις, κάτι που την κάνει μια πολύ καλή γλώσσα για προγραμματισμό σε CGI.

 

Σύντομη Ιστορία της Perl

Ο Larry Wall, ο δημιουργός της Perl, έστειλε για πρώτη φορά την Perl στην ομάδα συζητήσεων (newsgroup) comp.sources του Usenet στα τέλη του 1987. Ο Larry είχε δημιουργήσει την Perl σαν μια γλώσσα επεξεργασίας κειμένου (text processing language) για λειτουργικά συστήματα παρόμοια με το Unix. Πριν από την Perl, όλη σχεδόν η επεξεργασία κειμένου στα συστήματα Unix γινόταν με μια συνένωση εργαλείων που περιελάμβανε το AWK, το sed, τις διάφορες γλώσσες προγραμματισμού shell και προγράμματα γραμμένα σε C.

Ο Larry ήθελε να καλύψει το κενό που υπήρχε ανάμεσα στο "manipulexity" (η ικανότητα γλωσσών όπως η C να μπορούν να επεμβαίνουν σε εσωτερικούς μηχανισμούς) και στο "whipuptitude" (η ιδιότητα των γλωσσών προγραμματισμού όπως η AWK ή η sh που δίνει την δυνατότητα στους προγραμματιστές να γράφουν στα γρήγορα χρήσιμα προγράμματα). Έτσι, γεννήθηκε η Perl, η Practical Extraction and Report Language. Η Perl κάλυψε ένα κενό που κανένα άλλο εργαλείο δεν είχε καλύψει μέχρι τότε.

Τα επόμενα χρόνια, η Perl άρχισε να εξελίσσεται. Μέχρι το 1992, η έκδοση 4 (version 4) της Perl είχε γίνει πολύ σταθερή και ήταν η στάνταρτ γλώσσα προγραμματισμού στο Unix. Όμως, η Perl είχε αρχίσει να φανερώνει τις αδυναμίες της. Η Perl δούλευε πολύ καλά για μικρά προγράμματα αλλά η συγγραφή μεγάλων εφαρμογών μ’ αυτήν ήταν μια δύσκολη και επίπονη δουλειά. Οι σχεδιαστές της Perl, που τώρα πια ήταν μια ομάδα, αλλά πάντα κάτω από την καθοδήγηση του Larry, έριξαν μια ματιά στις άλλες γλώσσες που χρησιμοποιόντουσαν τότε και υπέβαλαν την εξής ερώτηση στον εαυτό τους :

"Γιατί οι χρήστες επιλέγουν άλλες γλώσσες εκτός από την Perl;"

Το αποτέλεσμα αυτού του αυτοελέγχου ήταν η έκδοση 5 (version 5) της Perl. Η πρώτη κυκλοφορία (release) της έκδοσης 5 ήρθε στα τέλη του 1994. Πολλοί πίστεψαν ότι η έκδοση 5 έκανε την Perl να είναι πλήρης. Διορθώθηκαν πολλά προβλήματα που υπήρχαν στην έκδοση 4. Με την έκδοση 5, η Perl έγινε πράγματι μια βιώσιμη, γενικής χρήσης γλώσσα προγραμματισμού και όχι πλέον ένα βολικό εργαλείο για τους system administrators.

 

Τα Βασικά για την Perl

Ένα πρόγραμμα σε Perl βρίσκεται σ’ ένα αρχείο, το οποίο έχουμε ορίσει να είναι εκτελέσιμο με μια εντολή σαν την chmod +x filename, στον κατάλογο bin, όπου η πρώτη γραμμή του αρχείου είναι η εξής :

#!/usr/bin/perl

Ο,τιδήποτε ακολουθεί αυτήν την πρώτη γραμμή είναι κώδικας σε Perl εκτός από τις γραμμές που αρχίζουν με το σύμβολο #, οι οποίες αποτελούν σχόλια (comments). Η κάθε εντολή στην Perl θα πρέπει να τελειώνει με το σύμβολο ; (semicolon).

Τα προγράμματα της Perl είναι κάπως έτσι :

εντολή;

εντολή;

# αυτό είναι ένα σχόλιο (comment), όπου μπορούμε να γράψουμε

# ό,τι θέλουμε εδώ

εντολή;

Αφού έχουμε γράψει ένα πρόγραμμα σε Perl και το έχουμε αποθηκεύσει με επέκταση .pl, μπορούμε να το τρέξουμε (εκτελέσουμε) γράφοντας το όνομα του αρχείου στο οποίο περιέχεται. Αν έχουμε κάνει κάποια λάθη στον κώδικα, η Perl δεν θα το τρέξει και θα εμφανίσει κάποιο μήνυμα λάθους.

 

Η Εντολή Print

Η εντολή print χρησιμοποιείται για να εμφανίζουμε μηνύματα στην οθόνη. Ακολουθεί ένα πολύ απλό παράδειγμα :

#!/usr/bin/perl

print "1 + 2 = 3\n";

Αν εκτελέσουμε το παραπάνω πρόγραμμα, θα εμφανισθεί στην οθόνη το εξής :

1 + 2 = 3

Ο χαρακτήρας \n είναι η εντολή για το τέλος γραμμής (end-of-line statement).

 

Οι Μεταβλητές της Perl

Μπορούμε να αποθηκεύσουμε τα δεδομένα μας σε μεταβλητές (variables) και να τα χρησιμοποιούμε όποτε θέλουμε. Ακολουθεί το προηγούμενο πρόγραμμα με την χρήση μεταβλητών :

#!/usr/bin/perl

$x = 1;

$y = 2;

$z = 3;

print "$x + $y = $z\n";

Όσες μεταβλητές περιέχονται μέσα σε εισαγωγικά θα αντικατασταθούν με τα δεδομένα που περιέχουν. Έτσι, όταν τρέξουμε το παραπάνω πρόγραμμα, θα έχουμε το εξής αποτέλεσμα :

1 + 2 = 3

 

Εκχώρηση Τιμών σε Μεταβλητές

Η παραπάνω εντολή print δεν πρόσθεσε στην πραγματικότητα τους αριθμούς. Μπορούμε να προσθέσουμε τις τιμές των μεταβλητών $x και $y με μια εντολή σαν την εξής :

$z = $x + $y;

Η παραπάνω γραμμή αποθηκεύει το αποτέλεσμα της πρόσθεσης στην μεταβλητή $z. Έτσι, το παρακάτω πρόγραμμα :

#!/usr/bin/perl

$x = 1;

$y = 2;

$z = $x + $y;

print "$x + $y = $z\n";

θα εμφανίσει ξανά το μήνυμα :

1 + 2 = 3

 

Λαμβάνοντας Είσοδο από τον Χρήστη

Οι μεταβλητές προσθέτουν ευελιξία στα προγράμματα. Μπορούμε τώρα να αλλάξουμε το παραπάνω πρόγραμμα ώστε να προσθέτει οποιουσδήποτε δύο αριθμούς καταχωρήσουμε. Για να μπορέσουμε να λάβουμε είσοδο (input) από το πληκτρολόγιο σ’ ένα πρόγραμμα που εκτελείται, δίνουμε την εξής εντολή :

$x = <>;

Όταν ένα πρόγραμμα συναντήσει μια εντολή σαν την παραπάνω, θα σταματήσει και θα περιμένει για καταχώρηση αριθμών ή γραμμάτων ή ο,τιδήποτε άλλο από το πληκτρολόγιο και μέχρι να πατηθεί το πλήκτρο enter. Μετά θα εκχωρήσει στην μεταβλητή $x ό,τι έχουμε καταχωρήσει από το πληκτρολόγιο και το πρόγραμμα θα μπορεί μετά να χρησιμοποιήσει αυτήν την τιμή. Έτσι, το παρακάτω πρόγραμμα :

#!/usr/bin/perl

print "Δώστε έναν αριθμό : ";

$x = <>;

chop($x);

print "Δώστε έναν αριθμό : ";

$y = <>;

chop($y);

$z = $x + $y;

print "$x + $y = $z\n";

θα περιμένει για την καταχώρηση δύο αριθμών, τους οποίους θα προσθέσει και θα εμφανίσει το αποτέλεσμα.

Το μόνο παράξενο με το παραπάνω πρόγραμμα είναι η εντολή chop. Όταν η τιμή της μεταβλητής $x προέρχεται από το πληκτρολόγιο, αποθηκεύεται μαζί με τον χαρακτήρα \n από το πάτημα του πλήκτρου enter. Για παράδειγμα, αν γράψουμε 35 και μετά πατήσουμε το enter, η τιμή της μεταβλητής $x θα είναι 35\n.

Η εντολή chop αποκόπτει τον τελευταίο χαρακτήρα μιας μεταβλητής και η πιο κοινή χρήση της είναι για να απαλλαγούμε απ’ αυτό το ενοχλητικό "\n".

 

Οι Υπορουτίνες (Subroutines)

Όπως βλέπουμε, στο παραπάνω πρόγραμμα, οι έξι πρώτες γραμμές ουσιαστικά κάνουν το ίδιο πράγμα δύο φορές. Αν χρειασθεί να γράψουμε τα ίδια πράγματα πολλές φορές σ’ ένα πρόγραμμα, θα πρέπει να δημιουργήσουμε μια υπορουτίνα (subroutine). Μια υπορουτίνα είναι μια εντολή που ορίζουμε (δημιουργούμε) μόνοι μας. Θα δημιουργήσουμε τώρα μια παραλλαγή του προγράμματος όπου θα χρησιμοποιήσουμε μια υπορουτίνα με όνομα getnumber η οποία θα διαβάζει έναν αριθμό από το πληκτρολόγιο :

#!/usr/bin/perl

$x = &getnumber;

$y = &getnumber;

$z = $x + $y;

print "$x + $y = $z\n";

# Το πρόγραμμα τελειώνει εδώ

# Η υπορουτίνα μπαίνει στο τέλος

sub getnumber {

print "Δώστε έναν αριθμό : ";

$number = <>;

chop($number);

$number;

}

Ό,τι υπάρχει ανάμεσα στις αγκύλες { } αποτελεί την υπορουτίνα (subroutine). Αυτό το κομμάτι του προγράμματος θα εκτελείται κάθε φορά που χρησιμοποιούμε την παρακάτω εντολή :

&getnumber;

στο πρόγραμμά μας. Σ’ αυτήν την περίπτωση, η υπορουτίνα "getnumber" επιστρέφει μια μεταβλητή η οποία μετά εκχωρείται στις μεταβλητές $x και $y. Δεν είναι σχεδιασμένες όλες οι υπορουτίνες για να επιστρέφουν μεταβλητές. Η παρακάτω εντολή επιστρέφει τα περιεχόμενα του $number :

$number;

Έτσι, η παρακάτω εντολή :

$x = &getnumber;

πρώτα εκτελεί την υπορουτίνα και όταν βλέπει την γραμμή $number; βγαίνει από την υπορουτίνα και δίνει στο $x την τιμή του $number.

Μπορούμε να έχουμε μια υπορουτίνα που να εκτυπώνει ένα μήνυμα :

sub warning {

     print "ΠΡΟΣΟΧΗ : Το πρόγραμμα θα σας ζητήσει έναν αριθμό!\n";

}

 Έτσι, η παρακάτω γραμμή :

&warning;

θα εμφανίσει το εξής μήνυμα :

ΠΡΟΣΟΧΗ : Το πρόγραμμα θα σας ζητήσει έναν αριθμό!

Μπορούμε να τοποθετήσουμε τον κώδικα για τις υπορουτίνες οπουδήποτε θέλουμε στο πρόγραμμά μας, αλλά το παραδοσιακό μέρος για να τις έχουμε όλες μαζί είναι στο τέλος του προγράμματος, μετά από το κυρίως κομμάτι του.

 

Ο Βρόχος While

Μέχρι τώρα τα προγράμματα που έχουμε δει εκτελούνται μία μόνο φορά και μετά τελειώνουν. Πολλές φορές θα θέλουμε το πρόγραμμά μας να κάνει κάτι συνεχώς. Αυτό μπορούμε να το πετύχουμε με μια δομή ελέγχου (control structure) η οποία δημιουργεί έναν βρόχο (loop).

Υπάρχουν πολλά είδη δομών ελέγχου και εδώ θα ξεκινήσουμε με μια απλή δομή που αποκαλείται while. Σημαίνει βασικά το εξής : εκτέλεσε κάποιο σύνολο εντολών ενώ (while) είναι αληθής (true) κάποια συνθήκη. Ακολουθεί ένα κομμάτι κώδικα που εκτελείται συνέχεια όσο καταχωρούμε τον αριθμό 15 :

$x = 15;

while($x == 15) {

$x = &getnumber;

}

Δύο πράγματα που πρέπει να επισημάνουμε εδώ :

1) Το $x == 15 σημαίνει "Το $x είναι ίσο με 15" και είναι μια εντολή σύγκρισης που δεν θα πρέπει να συγχέεται με την εντολή $x = 15, η οποία εκχωρεί την τιμή 15 στην μεταβλητή $x.

2) Η πρώτη γραμμή του κώδικα δίνει στην $x την τιμή 15. Αν δεν το κάναμε αυτό, η $x δεν θα ήταν ίση με 15 την πρώτη φορά που θα τρέχαμε το πρόγραμμα και έτσι το πρόγραμμα δεν θα έμπαινε καθόλου στον βρόχο και συνεπώς δεν θα ζητούσε έναν αριθμό.

Ακολουθεί το πρόγραμμα της πρόσθεσης μ’ έναν βρόχο (loop) ώστε να μπορούμε να το χρησιμοποιούμε συνέχεια :

#!/usr/bin/perl

$doagain = "yes";

while($doagain eq "yes") {

            $x = &getnumber;

            $y = &getnumber;

            $z = $x + $y;

                        print "$x + $y = $z\n";

            print "Να επαναληφθεί; (yes ή no) ";

                        $doagain = <>;

            chop($doagain);

            }

Θα πρέπει να προσθέσουμε και την υπορουτίνα (subroutine) για να μπορέσει να τρέξει το πρόγραμμα. Βλέπουμε ότι η εντολή σύγκρισης αυτή τη φορά χρησιμοποιεί τον τελεστή "eq" και όχι τον "==". Ο == συγκρίνει αριθμητικές τιμές, ενώ ο eq χρησιμοποιείται για μεταβλητές που αποτελούνται από γράμματα, αριθμούς και άλλους χαρακτήρες και που αποκαλούνται μεταβλητές string.

 

Οι Κανονικές Εκφράσεις (Regular Expressions)

Στο προηγούμενο πρόγραμμα πρέπει να βρούμε έναν τρόπο ελέγχου ώστε να είμαστε βέβαιοι ότι ο χρήστης καταχώρησε πράγματι αριθμούς και όχι γράμματα ή ειδικά σύμβολα και στην περίπτωση που καταχώρησε κάτι διαφορετικό από αριθμούς, θα πρέπει να ζητήσουμε ξανά την εισαγωγή αριθμών με την βοήθεια μιας δομής βρόχου.

Η Perl διαθέτει δύο δυνατά εργαλεία για επεξεργασία κειμένου και πιο συγκεκριμένα για ταίριασμα υποδειγμάτων (pattern matching) και για κανονικές εκφράσεις (regular expressions). Θα ξεκινήσουμε μ’ ένα απλό υπόδειγμα που περιέχει ένα μόνο γράμμα. Για παράδειγμα, αν θέλουμε να διαπιστώσουμε αν μια μεταβλητή περιέχει το γράμμα "z", χρησιμοποιούμε την εξής σύνταξη :

            if ($x =~ /z/) {

                        print "Το $x περιέχει ένα z!\n";

            }

Η if είναι μια εντολή σύγκρισης, όπως η while, με την διαφορά ότι κάνει έλεγχο μία μόνο φορά και δεν μπαίνει σε βρόχο (loop). Όπως η while, θα εκτελέσει όλες τις εντολές που βρίσκονται ανάμεσα στις αγκύλες στην περίπτωση που είναι αληθής (true) η συνθήκη που βρίσκεται ανάμεσα στις παρενθέσεις. Η εντολή που βρίσκεται ανάμεσα στις παρενθέσεις χρησιμοποιεί τον τελεστή =~ για να συγκρίνει το $x και ό,τι βρίσκεται ανάμεσα στις δύο καθέτους / /. Στην συγκεκριμένη περίπτωση, αν υπάρχει ένα z οπουδήποτε μέσα στο $x, τότε η εντολή είναι αληθής (true).

Θα ελέγξουμε τώρα αν το $x αρχίζει με το γράμμα z :

            if ($x =~ /Ùz/) {

                        print "Το $x αρχίζει με ένα z!\n";

            }

Το Ùz είναι μια κανονική έκφραση (regular expression) και το σύμβολο (Ù) παριστάνει την αρχή του string. Αυτό σημαίνει ότι η εντολή θα πρέπει να βρει ένα z στην αρχή του string για να είναι αληθής (true). Στην περίπτωση που ψάχνουμε για λέξεις που αρχίζουν με το γράμμα z και τελειώνουν με το γράμμα e, για παράδειγμα, θα πρέπει να χρησιμοποιήσουμε την εξής κανονική έκφραση (regexp) :

/Ùz.*e$/

Το $ συμβολίζει το τέλος του string και η τελεία (.) σημαίνει ότι μπορεί να υπάρχει ένας οποιοσδήποτε χαρακτήρας, οπότε σε συνδυασμό με το αστεράκι (*) σημαίνει κανένας ή περισσότεροι χαρακτήρες.

Χωρίς το αστεράκι

            /Ùz.e$/

θα σήμαινε το z ακολουθούμενο από έναν οποιονδήποτε χαρακτήρα και μετά ακολουθούμενο από το e.

Η παρακάτω κανονική έκφραση

            /Ùz.+e$/

σημαίνει το z ακολουθούμενο από έναν τουλάχιστον χαρακτήρα και μετά ακολουθούμενο από το e.

Ενώ η παρακάτω κανονική έκφραση

            /Ùz\w*e$/

σημαίνει το z ακολουθούμενο από κανέναν ή περισσότερους χαρακτήρες λέξεων και μετά ακολουθούμενο από το e.

Έτσι, για να είμαστε σίγουροι ότι κάποιος καταχωρεί αριθμούς στο πρόγραμμα άθροισης και όχι λέξεις, θα πρέπει να αλλάξουμε την υπορουτίνα getnumber ως εξής :

            sub getnumber {

                        $number = "aaaa";

                        while($number =~ /\D/) {

                                    print "Δώστε έναν αριθμό : ";

                                    $number = <>;

                                    chop($number);

                        }

                        $number;

            }

Η "\D" είναι η κανονική έκφραση για χαρακτήρες που δεν είναι ψηφία, δηλ. αν κάποιος χαρακτήρας στην μεταβλητή $number δεν βρίσκεται στο διάστημα 0-9, η έκφραση δεν θα ταιριάζει και θα ζητηθεί ξανά η καταχώρηση ενός αριθμού. Βέβαια, αναγκασθήκαμε να δώσουμε αρχικά στην μεταβλητή $number μια τιμή που δεν περιέχει ψηφία ($number = "aaaa") για να μπορέσουμε να μπούμε μέσα στον βρόχο.

 

Η Αντικατάσταση (Substitution)

Μπορούμε να χρησιμοποιήσουμε τις κανονικές εκφράσεις και την εντολή αντικατάστασης (substitution command), όπως για παράδειγμα για να αλλάξουμε τα γράμματα "dog" σε "cat" στην μεταβλητή $x :

            x =~ s/dog/cat/;

Στην ουσία, η παραπάνω εντολή θα αλλάξει μόνο την τελευταία εμφάνιση, δηλ. το "dogdog" θα γίνει "dogcat", και για να κάνουμε την αλλαγή να είναι πλήρης, θα πρέπει να προσθέσουμε ένα g στο τέλος, ως εξής :

            $x =~ s/dog/cat/g;

Η παρακάτω εντολή θα αλλάξει τα "dig" και "dog", αλλά όχι το "doug", σε "cat" :

            $x =~ s/d.g/cat/g;

 

Οι Πίνακες (Arrays)

Ένας αριθμός ή ένα string μπορεί να εκχωρηθεί σε μια βαθμωτή (scalar) μεταβλητή, ως εξής :

            $x = 45;

Αν έχουμε πολλές μεταβλητές και θέλουμε να τις αποθηκεύσουμε όλες μαζί, μπορούμε να χρησιμοποιήσουμε έναν πίνακα (array). Για παράδειγμα, για να εκχωρήσουμε τους αριθμούς 3, 5, 7 και 9 σ’ έναν πίνακα με όνομα @myarray, κάνουμε τα εξής :

            @myarray = (3, 5, 7, 9);

Αν και ολόκληρος ο πίνακας αναφέρεται ως @myarray, ένα μεμονωμένο στοιχείο του, ας πούμε το πρώτο, αναφέρεται ως $myarray[0]. Έτσι, το $myarray[0] είναι ίσο με 3 και το $myarray[1] είναι ίσο με 5. Πρέπει να έχουμε υπόψη μας ότι η μεταβλητή $myarray και τα στοιχεία πίνακα $myarray[0] ... $myarray[3] δεν έχουν καμία απολύτως σχέση μεταξύ τους. Το $myarray μπορεί να πάρει την τιμή "florina" ή 56000 και δεν μπορεί να επηρεάσει κάποιο από τα στοιχεία του πίνακα @myarray.

 

Η Εντολή if/then/elsif/else

Μπορούμε να χρησιμοποιήσουμε την εντολή if, ως εξής :

            print "Είσαι 30 χρονών\n" if ($age == 30);

Η παραπάνω εντολή αποτελεί μια συντόμευση της εξής εντολής :

            if ($age == 30) {

                        print "Είσαι 30 χρονών\n";

            }

η οποία σημαίνει ότι αν η μεταβλητή $age είναι ίση με την τιμή 30, τότε θα εκτελεσθούν όλες οι εντολές που βρίσκονται μέσα στα άγκιστρα { και }.

Η δομή ελέγχου if/then μπορεί να επεκταθεί με τις εντολές elsif και else, ως εξής :

            if ($age == 30) {

                        print "Είσαι 30 χρονών\n";

            } elsif ($sex eq "f") {

                        print "Είσαι γυναίκα\n";

            } elsif ($sex eq "m") {

                        print "Είσαι άνδρας\n";

            } else {

                        print "Αποτελείς ένα μυστήριο ...";

            }

Μόνο η πρώτη αληθής εντολή θα ταιριάξει. Έτσι, αν ($age == 30) και ($sex eq "f"), θα πάρουμε την εξής έξοδο :

               Είσαι 30 χρονών

Το else είναι η προκαθορισμένη (default) επιλογή, που σημαίνει ότι οι εντολές που το ακολουθούν θα εκτελεσθούν μόνο στην περίπτωση που καμία από τις προηγούμενες εντολές της δομής ελέγχου δεν είναι αληθής (true).

 

Οι Δομές while/until

Η δομή while είναι παρόμοια με τις δομές while στις γλώσσες προγραμματισμού Java, C και C++. Ο κώδικας εκτελείται ενόσω (while) η έκφραση παραμένει αληθής (true).

            use strict;

            while (έκφραση) {

                        Εντολή_While;

                        Εντολή_While;

                        Εντολή_While;

            }

Η δομή until (έκφραση) είναι λειτουργικά ισοδύναμη με την δομή while (! έκφραση).

 

Οι Δομές do while/until

Η δομή do/while εργάζεται παρόμοια με την δομή while, με την διαφορά ότι ο κώδικας εκτελείται μία τουλάχιστον φορά πριν από τον έλεγχο της συνθήκης.

            use strict;

            do {

                        Εντολή_DoWhile;

                        Εντολή_DoWhile;

                        Εντολή_DoWhile;

            } while (έκφραση);

Και εδώ, η χρήση της δομής until (έκφραση) είναι ίδια με την χρήση της δομής while (! έκφραση).

 

Η Δομή For

Η δομή for εργάζεται παρόμοια με την δομή for στις στις γλώσσες προγραμματισμού C, C++ και Java και είναι ισοδύναμη με την εντολή while. Έτσι, η παρακάτω σύνταξη :

use strict;

for(Αρχική_Εντολή; έκφραση; Εντολή_Αύξησης) {

            Εντολή_For;

Εντολή_For;

Εντολή_For;

}

είναι ισοδύναμη με την εξής :

use strict;

Αρχική_Εντολή;

while (έκφραση) {

Εντολή_For;

Εντολή_For;

Εντολή_For;

Εντολή_Αύξησης;

}

 

Η Δομή Foreach

Η δομή ελέγχου foreach είναι η πιο ενδιαφέρουσα καθώς είναι ειδικά σχεδιασμένη για την επεξεργασία των γηγενών τύπων δεδομένων της Perl. Η εντολή foreach δέχεται μια βαθμωτή μεταβλητή, μια λίστα τιμών και ένα μπλοκ εντολών και εκτελεί το μπλοκ των εντολών, θέτοντας την μεταβλητή ίση με κάθε τιμή που υπάρχει στην λίστα.

Ακολουθεί ένα παράδειγμα :

use strict;

my @collection = qw/florina kozani grevena kastoria/;

foreach my $poli (@collection) {

print "$poli\n";

}

Ο παραπάνω κώδικας θα εκτυπώσει το κάθε στοιχείο (poli) που υπάρχει στην λίστα collection σε ξεχωριστή γραμμή κάθε φορά. Βλέπουμε ότι έχουμε την δυνατότητα να δηλώσουμε την βαθμωτή μεταβλητή μέσα στην εντολή foreach. Όταν το κάνουμε αυτό, η μεταβλητή έχει χρόνο ζωής όσο διαρκεί η εκτέλεση της εντολής foreach. Η εντολή foreach αποτελεί μια από τις πιο χρήσιμες δομές βρόχου της Perl. Κάθε φορά που θέλουμε να κάνουμε κάτι σε κάθε στοιχείο μιας λίστας, η χρήση μιας εντολής foreach είναι η καλύτερη επιλογή.

 

Χειρισμός Αρχείων με την Perl

Με την Perl μπορούμε να γράψουμε σ’ ένα αρχείο το ίδιο εύκολα όσο μπορούμε να γράψουμε (εμφανίσουμε) κάτι στην οθόνη. Το πρώτο, και ουσιαστικά το μοναδικό, βήμα είναι να ανοίξουμε το αρχείο με την εντολή open. Ακολουθεί ένα παράδειγμα :

open(MYFILE, ">/home/scotty/data/dogs");

Το MYFILE είναι το χειριστήριο αρχείου (filehandle), δηλ. το όνομα με το οποίο θα αναφερόμαστε από δω και πέρα στο αρχείο που έχουμε ανοίξει. Αποτελεί μια συνήθεια να χρησιμοποιούμε κεφαλαία γράμματα για τα χειριστήρια αρχείων. Η άλλη παράμετρος μέσα στις παρενθέσεις είναι το πλήρες όνομα (full pathname) του αρχείου, το οποίο έχει το σύμβολο > μπροστά του, ώστε να μπορούμε να γράψουμε στο αρχείο. Αν δεν υπάρχει το σύμβολο >, τότε θα μπορούμε μόνο να διαβάσουμε από το αρχείο.

Για να γράψουμε τώρα μια γραμμή κειμένου στο αρχείο, κάνουμε το εξής :

print MYFILE "Αυτή η γραμμή πάει στο αρχείο και όχι στην οθόνη.\n";

Εφόσον είναι γνωστό ότι η αποτυχία στο άνοιγμα ενός αρχείου είναι μια δυσάρεστη κατάσταση, αποτελεί καλή ιδέα να χειριστούμε αυτήν την κατάσταση με ομαλό τρόπο. Προς τον σκοπό αυτό, χρησιμοποιούμε την εξής σύνταξη για την εντολή open :

open(MYFILE,">/home/scotty/data/dogs") || die "Δεν άνοιξε το MYFILE.\n";

Τώρα ή θα ανοίξει το αρχείο ή θα εγκαταλείψουμε το πρόγραμμα με μια κομψή εξήγηση. Για να μπορέσουμε να διαβάσουμε από ένα αρχείο, πρέπει να το ανοίξουμε χωρίς το σύμβολο >, ως εξής :

open(MYFILE,"/home/scotty/data/dogs") || die " Δεν άνοιξε το MYFILE.\n";

Αφού ανοίξει το αρχείο, υπάρχουν δύο τρόποι για να πάρουμε πληροφορίες απ’ αυτό. Μπορούμε να διαβάζουμε μία γραμμή του την φορά με μια εντολή σαν την εξής :

$x = <MYFILE>;

Η παραπάνω εντολή αντιγράφει την πρώτη γραμμή από το MYFILE, ή την επόμενη γραμμή αν έχουμε ήδη διαβάσει μερικές γραμμές, και την εκχωρεί στην μεταβλητή $x. Η σύνταξη <MYFILE> είναι σαν την <> που χρησιμοποιήσαμε προηγουμένως για να πάρουμε είσοδο από το πληκτρολόγιο. Η χρήση του MYFILE λέει απλά στην Perl να πάρει την είσοδο από ένα ανοικτό αρχείο και όχι από το πληκτρολόγιο, που είναι η προκαθορισμένη (default) επιλογή.

Μπορούμε, όμως, να χρησιμοποιήσουμε κι έναν βρόχο, όπως το παρακάτω πρόγραμμα που εκτυπώνει όλα τα περιεχόμενα του αρχείου MYFILE :

#!/usr/bin/perl

open(MYFILE,"/home/scotty/data/dogs") || die " Δεν άνοιξε το MYFILE.\n";

while(<MYFILE>) {

print;

}

Βλέπουμε ότι δεν ορίσαμε μια μεταβλητή για να αποθηκεύσουμε εκεί την κάθε γραμμή από το αρχείο MYFILE και δεν ορίσαμε τίποτα για να εκτυπώσει η εντολή print. Η Perl έχει μια πραγματικά σημαντική ιδιότητα : χρησιμοποιεί μια προκαθορισμένη μεταβλητή (default variable) με όνομα $_. Αυτό σημαίνει ότι αν δεν καθορίσουμε ποια μεταβλητή θέλουμε να χρησιμοποιήσουμε ή αν χρησιμοποιήσουμε μια εντολή σαν την print μόνη της χωρίς ορίσματα, η Perl υποθέτει ότι θέλουμε να χρησιμοποιήσουμε την μεταβλητή $_.

Μια άλλη εντολή που έχει σχέση με την $_ είναι η εξής :

s/dog/cat/g;

Σημαίνει την αντικατάσταση όλων των εμφανίσεων του 'dog' στην μεταβλητή $_ με το 'cat'".

Μια άλλη δημοφιλής εντολή είναι η εξής :

print if (/dog/);

Που σημαίνει "τύπωσε το $_ αν το $_ περιέχει το 'dog'".

Η μεταβλητή $_ εμφανίζεται οπουδήποτε στην Perl, απλά και μόνο για να κάνει την ζωή μας πιο εύκολη. Για παράδειγμα, η εντολή foreach θα αποθηκεύσει τα στοιχεία της στην μεταβλητή $_ αν δεν ορίσουμε μια μεταβλητή, ως εξής :

foreach (@array) {

print if (/Tonight/);

}

Μπορούμε να εκχωρήσουμε τιμές από την $_ ή να την χειριστούμε όπως όλες τις άλλες μεταβλητές, ως εξής :

$_++;

$x = $_;

Θα πρέπει να χρησιμοποιήσουμε μια εντολή σαν την παραπάνω αν θέλουμε να κρατήσουμε τα περιεχόμενα της μεταβλητής $_, τα οποία θα χαθούν αν χρησιμοποιήσουμε μια εντολή σαν την επόμενη :

<MYFILE>

Όταν έχουμε τελειώσει μ’ ένα αρχείο, δεν θα πρέπει να ξεχάσουμε να το κλείσουμε με την εντολή close, ως εξής :

close(MYFILE);

 

Διάβασμα Αρχείων Καταλόγου με την Perl

Η Perl μπορεί να διαβάσει όλα τα ονόματα αρχείων (filenames) που υπάρχουν σ’ έναν κατάλογο, όπως ο /home/scotty/bin, με την εξής σύνταξη :

while($x = </home/scotty/bin/*>) {

...

}

Μια πολύ καλή χρήση αυτής της δυνατότητας είναι ο εξής βρόχος :

while($x = </home/scotty/bin/*>) {

open(FILE, "$x") ||die "Δεν άνοιξε το $x για διάβασμα.\n";

...

}

Το επόμενο πρόγραμμα θα εκτυπώσει όλες τις γραμμές που περιέχουν την λέξη "dog" μαζί με τα ονόματα των αρχείων από τα οποία προέρχονται, και βρίσκονται στον κατάλογο /home/scotty/bin :

#!/usr/bin/perl

while($x = </home/scotty/bin/*>) {

open(FILE, "$x") || die "Δεν άνοιξε το $x για διάβασμα.\n";

 while(<FILE>){

if(/dog/) {

print "$x: $_";

}

}

}

 

Τα Πλεονεκτήματα της Perl

 

Τα Μειονεκτήματα της Perl

 

back.gif (9867 bytes)

Επιστροφή