Post on 23-Feb-2015
BIO 331Αρχές και μέθοδοιΒιοπληροφορικής Ι
Στοιχεία προγραμματισμού με τη γλώσσα Perl
Βασίλης Ι ΠρομπονάςΕρευνητικό Εργαστήριο Βιοπληροφορικής
Τμήμα Βιολογικών Επιστημών Πανεπιστήμιο Κύπρου1678 Λευκωσία
Κύπρος
copyΒασίλης Ι ΠρομπονάςΛευκωσία 2009
ii
Περιεχόμενα
1 Perl 111 Εισαγωγή 2
Λίγα ιστορικά στοιχεία 2Το απόφθεγμα της Perl TMTOWTDI 3
12 Τεχνικές συμβουλές και συμβάσεις 4Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματισμού5Ο διερμηνευτής της Perl 6Μορφοποίηση προγράμματος 9
13 Μεταβλητές στην Perl 11Μεταβλητές 12
14 Βαθμωτές (Scalar) Μεταβλητές 13Αλφαριθμητικές αλληλουχίες - Strings 14Χρήση εισαγωγικών και παρεμβολή μεταβλητών 15
15 Πίνακες (Arrays)- Λίστες (Lists) 16Πίνακες Ουρές (queues) και Στοίβες (stacks) 17
16 Ευρετήρια (hashes) 17Η συνάρτηση keys 18
17 Συμβάσεις συγγραφής κώδικα 1818 Τελεστές 18
Εντολές σύνθετης καταχώρησης 19Τελεστές (λογικοί και σύγκρισης) 19
19 Δομές ελέγχου και επανάληψης 24foreach 24
110 Ομαδοποίηση δηλώσεων και εντολών - blocks 25
iii
ΠΕΡΙΕΧΟΜΕΝΑ
111 Έλεγχος και επανάληψη 27if elsif else 27unless 28for 29while 30until 30do whileuntil 31Ιδιωματισμοί 31
112 Υποπρογράμματα - Subroutines 33Ειδικά υποπρογράμματα 35
113 Επέστρεψε βγες και πέθανε (return exit die) 35114 Ενότητες λογισμικού (modules) 36115 Διαδικασίες εισόδου-εξόδου (ΙΟ) 37
Παράμετροι προγραμμάτων από τη γραμμή εντολών 38Χρήση αρχείων 38
iv
Perl 1Η γλώσσα προγραμματισμού Perl έχει βρει πολλούς ακόλουθους και
φανατικούς υποστηρικτές στο χώρο της υπολογιστικής βιολογίαςκαι της βιοπληροφορικής Κύριοι λόγοι γιʼ αυτό είναι η γρήγορη ʻκα-
μπύλη μάθησηςʼ η οποία κατά κύριο λόγο οφείλεται
i στην απουσία strong typing 1 και
ii στην ενσωματωμένη δυνατότητα επεξεργασίας σειρών αλφαριθμητι-κών χαρακτήρων (strings) η οποία είναι εξαιρετικά χρήσιμη και βολικήγια την επεξεργασία αλληλουχιών βιολογικών μακρομορίων
Στο κεφάλαιο αυτό δίνονται τα βασικά εφόδια με τα οποία μπορείτε νααρχίσετε να εργάζεστε παραγωγικά με τη γλώσσα Perl και να αναπτύσσετεχρήσιμες εφαρμογές σε σύντομο χρονικό διάστημα
Προφανώς για όσους επιθυμούν να μυηθούν στα βαθύτερα μυστικά τηςγλώσσας απαιτείται να ανατρέξουν στη σχετική παρατιθέμενη βιβλιογρα-φία και (κυρίως) να αφιερώσουν αρκετές ώρες γράφοντας προγράμματα
1Αυτό βρίσκουν και ως μειονέκτημα και όσοι είναι ενάντιοι σε αυτή τη γλώσσα προγραμ-ματισμού
1
Perl
11 Εισαγωγή
Δεν προϋποτίθεται γνώση κάποιας γλώσσας προγραμματισμού (αν και αυτόθα μπορούσε να βοηθήσει πολύ στη γρήγορη εκμάθηση της Perl)
Θεωρείται ότι ο αναγνώστης έχει τουλάχιστον βασικές γνώσεις αρχιτεκτο-νικής ΗΥ (βασικά χαρακτηριστικά ΗΥ αρχεία συστήματα διαχείρισης αρ-χείων)
111 Λίγα ιστορικά στοιχεία
Η γλώσσα προγραμματισμού Perl σχεδιάστηκε από τον Larry Wall και ο πη-γαίος κώδικας της πρώτης έκδοσής της έγινε διαθέσιμος στο κοινό το ∆εκέμ-βριο του 1987 Η τελευταία σταθερή έκδοση της γλώσσας σήμερα είναι η510 ενώ εδώ και καιρό σχεδιάζεται η έκδοση 6 με υλοποίηση σημαντικώνβελτιώσεων και προσθηκών
Βασική προσδοκία των ανθρώπων που ασχολούνται με την ανάπτυξη τηςγλώσσας Perl αποτέλεσε εξαρχής η παροχή ιδιαίτερων δυνατοτήτων στηνεπεξεργασία αρχείων κειμένου δηλαδή για την
bull Εύκολη εξαγωγή πληροφοριών
bull Προσαρμοσμένη εκτύπωση αναφορών με τα αποτελέσματα επεξεργα-σίας
Τα παραπάνω στοιχεία δικαιολογούν το ακρωνύμιο Practical Extraction andReport Language στο οποίο κατά μία εκδοχή οφείλεται το όνομα αυτής τηςγλώσσας προγραμματισμού2 Παρόλα αυτά η προσθήκη πολλών χαρακτη-ριστικών καθιστούν την Perl κατάλληλη για αρκετές άλλες εργασίες όπωςγια παράδειγμα η διαχείριση συστημάτων και η ανάπτυξη διαδικτυακώνεφαρμογών
Όσον αφορά στο σχεδιασμό της η Perl παρέχει επιλεγμένα χαρακτηριστικάʻπαραδοσιακώνʼ γλωσσών προγραμματισμού όπως η C (με την οποία μοιά-ζει σημαντικά στο ʻσυντακτικόʼ) και (λιγότερο) η Pascal (ή για τους περισ-σότερο μυημένους η AWK η sed ή η γλώσσα sh του κελύφους του UNIX)
2Αν και ο ίδιος ο Wall αναφέρει χαριτολογώντας και το Pathologically Eclectic Rubbish Lister
2
Εισαγωγή
Επιπλέον η δυνατότητα αντικειμενοστρεφούς (object oriented) προγραμμα-τισμού με την Perl την κατατάσσει δίπλα σε ʻμοντέρνεςʼ γλώσσες όπως ηC++ και η JAVA
H Perl έχει αποκτήσει μια βάση φανατικών οπαδών που προέρχονται απότο πεδίο της βιοπληροφορικής και της υπολογιστικής βιολογίας 3 Τα χα-ρακτηριστικά της γλώσσας στα οποία οφείλεται αυτή η εξάπλωσή της είναι[σε άγκιστρα τομείς εφαρμογής στην υπολογιστική βιολογία]
bull Επεξεργασία κειμένου - αλφαριθμητικών [ανάλυση ακολουθιών δια-χείριση ΒΔ]
bull Εύκολος προγραμματισμός διαδικτυακών εφαρμογών [web services ΒΔ]
bull Λογισμικές επεκτάσεις (modules) ελεύθερες προς χρήση [BioPerl]
bull Υψηλές δυνατότητες διαχείρισης διαδικασιών (processes) [διαχείρισησυστημάτων]
Επίσης ορισμένα γενικά χαρακτηριστικά όπως
bull Εύκολη εκμάθηση
bull Εύκολη και γρήγορη συγγραφή μικρών και απλών προγραμμάτων 4
112 Το απόφθεγμα της Perl TMTOWTDI
ʻThere is More Than One Way To Do Itʼ hellip
Αν θα ήθελε κανείς να είναι συνεπής με το απόφθεγμα της Perl θα έπρεπενα δαπανήσει πολύ μεγάλο χρόνο για να παραθέσει τις διαφορετικές ισοδύ-ναμες περιπτώσεις με τις οποίες μπορούν να υλοποιηθούν στην Perl ακόμηκαι οι απλές προγραμματιστικές ιδέες που θα αναπτυχθούν στο εισαγωγικόαυτό μάθημα
Προφανώς κατά τα συνήθη όλες οι laquoεπιστημονικά τεκμηριωμένεςraquo λύσειςθα θεωρούνται σωστές Απαιτείται αρκετή προσωπική προσπάθεια ώστε
3Χωρίς αυτό να σημαίνει ότι αποτελεί τη μοναδική γλώσσα προγραμματισμού που χρησι-μοποιείται Στην πραγματικότητα κάθε γλώσσα προγραμματισμού πρέπει να χρησιμοποιεί-ται σε εφαρμογές ανάλογα με τα πλεονεκτήματα που προσφέρει
4Παρόλα αυτά τίποτε δεν είναι τέλειο σε αυτή τη ζωή Ορισμένες εργασίες που απαι-τούν ταχείς και πολλούς υπολογισμούς είναι καλό να υλοποιούνται σε άλλες πιο κατάλληλεςγλώσσες προγραμματισμού
3
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
ii
Περιεχόμενα
1 Perl 111 Εισαγωγή 2
Λίγα ιστορικά στοιχεία 2Το απόφθεγμα της Perl TMTOWTDI 3
12 Τεχνικές συμβουλές και συμβάσεις 4Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματισμού5Ο διερμηνευτής της Perl 6Μορφοποίηση προγράμματος 9
13 Μεταβλητές στην Perl 11Μεταβλητές 12
14 Βαθμωτές (Scalar) Μεταβλητές 13Αλφαριθμητικές αλληλουχίες - Strings 14Χρήση εισαγωγικών και παρεμβολή μεταβλητών 15
15 Πίνακες (Arrays)- Λίστες (Lists) 16Πίνακες Ουρές (queues) και Στοίβες (stacks) 17
16 Ευρετήρια (hashes) 17Η συνάρτηση keys 18
17 Συμβάσεις συγγραφής κώδικα 1818 Τελεστές 18
Εντολές σύνθετης καταχώρησης 19Τελεστές (λογικοί και σύγκρισης) 19
19 Δομές ελέγχου και επανάληψης 24foreach 24
110 Ομαδοποίηση δηλώσεων και εντολών - blocks 25
iii
ΠΕΡΙΕΧΟΜΕΝΑ
111 Έλεγχος και επανάληψη 27if elsif else 27unless 28for 29while 30until 30do whileuntil 31Ιδιωματισμοί 31
112 Υποπρογράμματα - Subroutines 33Ειδικά υποπρογράμματα 35
113 Επέστρεψε βγες και πέθανε (return exit die) 35114 Ενότητες λογισμικού (modules) 36115 Διαδικασίες εισόδου-εξόδου (ΙΟ) 37
Παράμετροι προγραμμάτων από τη γραμμή εντολών 38Χρήση αρχείων 38
iv
Perl 1Η γλώσσα προγραμματισμού Perl έχει βρει πολλούς ακόλουθους και
φανατικούς υποστηρικτές στο χώρο της υπολογιστικής βιολογίαςκαι της βιοπληροφορικής Κύριοι λόγοι γιʼ αυτό είναι η γρήγορη ʻκα-
μπύλη μάθησηςʼ η οποία κατά κύριο λόγο οφείλεται
i στην απουσία strong typing 1 και
ii στην ενσωματωμένη δυνατότητα επεξεργασίας σειρών αλφαριθμητι-κών χαρακτήρων (strings) η οποία είναι εξαιρετικά χρήσιμη και βολικήγια την επεξεργασία αλληλουχιών βιολογικών μακρομορίων
Στο κεφάλαιο αυτό δίνονται τα βασικά εφόδια με τα οποία μπορείτε νααρχίσετε να εργάζεστε παραγωγικά με τη γλώσσα Perl και να αναπτύσσετεχρήσιμες εφαρμογές σε σύντομο χρονικό διάστημα
Προφανώς για όσους επιθυμούν να μυηθούν στα βαθύτερα μυστικά τηςγλώσσας απαιτείται να ανατρέξουν στη σχετική παρατιθέμενη βιβλιογρα-φία και (κυρίως) να αφιερώσουν αρκετές ώρες γράφοντας προγράμματα
1Αυτό βρίσκουν και ως μειονέκτημα και όσοι είναι ενάντιοι σε αυτή τη γλώσσα προγραμ-ματισμού
1
Perl
11 Εισαγωγή
Δεν προϋποτίθεται γνώση κάποιας γλώσσας προγραμματισμού (αν και αυτόθα μπορούσε να βοηθήσει πολύ στη γρήγορη εκμάθηση της Perl)
Θεωρείται ότι ο αναγνώστης έχει τουλάχιστον βασικές γνώσεις αρχιτεκτο-νικής ΗΥ (βασικά χαρακτηριστικά ΗΥ αρχεία συστήματα διαχείρισης αρ-χείων)
111 Λίγα ιστορικά στοιχεία
Η γλώσσα προγραμματισμού Perl σχεδιάστηκε από τον Larry Wall και ο πη-γαίος κώδικας της πρώτης έκδοσής της έγινε διαθέσιμος στο κοινό το ∆εκέμ-βριο του 1987 Η τελευταία σταθερή έκδοση της γλώσσας σήμερα είναι η510 ενώ εδώ και καιρό σχεδιάζεται η έκδοση 6 με υλοποίηση σημαντικώνβελτιώσεων και προσθηκών
Βασική προσδοκία των ανθρώπων που ασχολούνται με την ανάπτυξη τηςγλώσσας Perl αποτέλεσε εξαρχής η παροχή ιδιαίτερων δυνατοτήτων στηνεπεξεργασία αρχείων κειμένου δηλαδή για την
bull Εύκολη εξαγωγή πληροφοριών
bull Προσαρμοσμένη εκτύπωση αναφορών με τα αποτελέσματα επεξεργα-σίας
Τα παραπάνω στοιχεία δικαιολογούν το ακρωνύμιο Practical Extraction andReport Language στο οποίο κατά μία εκδοχή οφείλεται το όνομα αυτής τηςγλώσσας προγραμματισμού2 Παρόλα αυτά η προσθήκη πολλών χαρακτη-ριστικών καθιστούν την Perl κατάλληλη για αρκετές άλλες εργασίες όπωςγια παράδειγμα η διαχείριση συστημάτων και η ανάπτυξη διαδικτυακώνεφαρμογών
Όσον αφορά στο σχεδιασμό της η Perl παρέχει επιλεγμένα χαρακτηριστικάʻπαραδοσιακώνʼ γλωσσών προγραμματισμού όπως η C (με την οποία μοιά-ζει σημαντικά στο ʻσυντακτικόʼ) και (λιγότερο) η Pascal (ή για τους περισ-σότερο μυημένους η AWK η sed ή η γλώσσα sh του κελύφους του UNIX)
2Αν και ο ίδιος ο Wall αναφέρει χαριτολογώντας και το Pathologically Eclectic Rubbish Lister
2
Εισαγωγή
Επιπλέον η δυνατότητα αντικειμενοστρεφούς (object oriented) προγραμμα-τισμού με την Perl την κατατάσσει δίπλα σε ʻμοντέρνεςʼ γλώσσες όπως ηC++ και η JAVA
H Perl έχει αποκτήσει μια βάση φανατικών οπαδών που προέρχονται απότο πεδίο της βιοπληροφορικής και της υπολογιστικής βιολογίας 3 Τα χα-ρακτηριστικά της γλώσσας στα οποία οφείλεται αυτή η εξάπλωσή της είναι[σε άγκιστρα τομείς εφαρμογής στην υπολογιστική βιολογία]
bull Επεξεργασία κειμένου - αλφαριθμητικών [ανάλυση ακολουθιών δια-χείριση ΒΔ]
bull Εύκολος προγραμματισμός διαδικτυακών εφαρμογών [web services ΒΔ]
bull Λογισμικές επεκτάσεις (modules) ελεύθερες προς χρήση [BioPerl]
bull Υψηλές δυνατότητες διαχείρισης διαδικασιών (processes) [διαχείρισησυστημάτων]
Επίσης ορισμένα γενικά χαρακτηριστικά όπως
bull Εύκολη εκμάθηση
bull Εύκολη και γρήγορη συγγραφή μικρών και απλών προγραμμάτων 4
112 Το απόφθεγμα της Perl TMTOWTDI
ʻThere is More Than One Way To Do Itʼ hellip
Αν θα ήθελε κανείς να είναι συνεπής με το απόφθεγμα της Perl θα έπρεπενα δαπανήσει πολύ μεγάλο χρόνο για να παραθέσει τις διαφορετικές ισοδύ-ναμες περιπτώσεις με τις οποίες μπορούν να υλοποιηθούν στην Perl ακόμηκαι οι απλές προγραμματιστικές ιδέες που θα αναπτυχθούν στο εισαγωγικόαυτό μάθημα
Προφανώς κατά τα συνήθη όλες οι laquoεπιστημονικά τεκμηριωμένεςraquo λύσειςθα θεωρούνται σωστές Απαιτείται αρκετή προσωπική προσπάθεια ώστε
3Χωρίς αυτό να σημαίνει ότι αποτελεί τη μοναδική γλώσσα προγραμματισμού που χρησι-μοποιείται Στην πραγματικότητα κάθε γλώσσα προγραμματισμού πρέπει να χρησιμοποιεί-ται σε εφαρμογές ανάλογα με τα πλεονεκτήματα που προσφέρει
4Παρόλα αυτά τίποτε δεν είναι τέλειο σε αυτή τη ζωή Ορισμένες εργασίες που απαι-τούν ταχείς και πολλούς υπολογισμούς είναι καλό να υλοποιούνται σε άλλες πιο κατάλληλεςγλώσσες προγραμματισμού
3
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Περιεχόμενα
1 Perl 111 Εισαγωγή 2
Λίγα ιστορικά στοιχεία 2Το απόφθεγμα της Perl TMTOWTDI 3
12 Τεχνικές συμβουλές και συμβάσεις 4Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματισμού5Ο διερμηνευτής της Perl 6Μορφοποίηση προγράμματος 9
13 Μεταβλητές στην Perl 11Μεταβλητές 12
14 Βαθμωτές (Scalar) Μεταβλητές 13Αλφαριθμητικές αλληλουχίες - Strings 14Χρήση εισαγωγικών και παρεμβολή μεταβλητών 15
15 Πίνακες (Arrays)- Λίστες (Lists) 16Πίνακες Ουρές (queues) και Στοίβες (stacks) 17
16 Ευρετήρια (hashes) 17Η συνάρτηση keys 18
17 Συμβάσεις συγγραφής κώδικα 1818 Τελεστές 18
Εντολές σύνθετης καταχώρησης 19Τελεστές (λογικοί και σύγκρισης) 19
19 Δομές ελέγχου και επανάληψης 24foreach 24
110 Ομαδοποίηση δηλώσεων και εντολών - blocks 25
iii
ΠΕΡΙΕΧΟΜΕΝΑ
111 Έλεγχος και επανάληψη 27if elsif else 27unless 28for 29while 30until 30do whileuntil 31Ιδιωματισμοί 31
112 Υποπρογράμματα - Subroutines 33Ειδικά υποπρογράμματα 35
113 Επέστρεψε βγες και πέθανε (return exit die) 35114 Ενότητες λογισμικού (modules) 36115 Διαδικασίες εισόδου-εξόδου (ΙΟ) 37
Παράμετροι προγραμμάτων από τη γραμμή εντολών 38Χρήση αρχείων 38
iv
Perl 1Η γλώσσα προγραμματισμού Perl έχει βρει πολλούς ακόλουθους και
φανατικούς υποστηρικτές στο χώρο της υπολογιστικής βιολογίαςκαι της βιοπληροφορικής Κύριοι λόγοι γιʼ αυτό είναι η γρήγορη ʻκα-
μπύλη μάθησηςʼ η οποία κατά κύριο λόγο οφείλεται
i στην απουσία strong typing 1 και
ii στην ενσωματωμένη δυνατότητα επεξεργασίας σειρών αλφαριθμητι-κών χαρακτήρων (strings) η οποία είναι εξαιρετικά χρήσιμη και βολικήγια την επεξεργασία αλληλουχιών βιολογικών μακρομορίων
Στο κεφάλαιο αυτό δίνονται τα βασικά εφόδια με τα οποία μπορείτε νααρχίσετε να εργάζεστε παραγωγικά με τη γλώσσα Perl και να αναπτύσσετεχρήσιμες εφαρμογές σε σύντομο χρονικό διάστημα
Προφανώς για όσους επιθυμούν να μυηθούν στα βαθύτερα μυστικά τηςγλώσσας απαιτείται να ανατρέξουν στη σχετική παρατιθέμενη βιβλιογρα-φία και (κυρίως) να αφιερώσουν αρκετές ώρες γράφοντας προγράμματα
1Αυτό βρίσκουν και ως μειονέκτημα και όσοι είναι ενάντιοι σε αυτή τη γλώσσα προγραμ-ματισμού
1
Perl
11 Εισαγωγή
Δεν προϋποτίθεται γνώση κάποιας γλώσσας προγραμματισμού (αν και αυτόθα μπορούσε να βοηθήσει πολύ στη γρήγορη εκμάθηση της Perl)
Θεωρείται ότι ο αναγνώστης έχει τουλάχιστον βασικές γνώσεις αρχιτεκτο-νικής ΗΥ (βασικά χαρακτηριστικά ΗΥ αρχεία συστήματα διαχείρισης αρ-χείων)
111 Λίγα ιστορικά στοιχεία
Η γλώσσα προγραμματισμού Perl σχεδιάστηκε από τον Larry Wall και ο πη-γαίος κώδικας της πρώτης έκδοσής της έγινε διαθέσιμος στο κοινό το ∆εκέμ-βριο του 1987 Η τελευταία σταθερή έκδοση της γλώσσας σήμερα είναι η510 ενώ εδώ και καιρό σχεδιάζεται η έκδοση 6 με υλοποίηση σημαντικώνβελτιώσεων και προσθηκών
Βασική προσδοκία των ανθρώπων που ασχολούνται με την ανάπτυξη τηςγλώσσας Perl αποτέλεσε εξαρχής η παροχή ιδιαίτερων δυνατοτήτων στηνεπεξεργασία αρχείων κειμένου δηλαδή για την
bull Εύκολη εξαγωγή πληροφοριών
bull Προσαρμοσμένη εκτύπωση αναφορών με τα αποτελέσματα επεξεργα-σίας
Τα παραπάνω στοιχεία δικαιολογούν το ακρωνύμιο Practical Extraction andReport Language στο οποίο κατά μία εκδοχή οφείλεται το όνομα αυτής τηςγλώσσας προγραμματισμού2 Παρόλα αυτά η προσθήκη πολλών χαρακτη-ριστικών καθιστούν την Perl κατάλληλη για αρκετές άλλες εργασίες όπωςγια παράδειγμα η διαχείριση συστημάτων και η ανάπτυξη διαδικτυακώνεφαρμογών
Όσον αφορά στο σχεδιασμό της η Perl παρέχει επιλεγμένα χαρακτηριστικάʻπαραδοσιακώνʼ γλωσσών προγραμματισμού όπως η C (με την οποία μοιά-ζει σημαντικά στο ʻσυντακτικόʼ) και (λιγότερο) η Pascal (ή για τους περισ-σότερο μυημένους η AWK η sed ή η γλώσσα sh του κελύφους του UNIX)
2Αν και ο ίδιος ο Wall αναφέρει χαριτολογώντας και το Pathologically Eclectic Rubbish Lister
2
Εισαγωγή
Επιπλέον η δυνατότητα αντικειμενοστρεφούς (object oriented) προγραμμα-τισμού με την Perl την κατατάσσει δίπλα σε ʻμοντέρνεςʼ γλώσσες όπως ηC++ και η JAVA
H Perl έχει αποκτήσει μια βάση φανατικών οπαδών που προέρχονται απότο πεδίο της βιοπληροφορικής και της υπολογιστικής βιολογίας 3 Τα χα-ρακτηριστικά της γλώσσας στα οποία οφείλεται αυτή η εξάπλωσή της είναι[σε άγκιστρα τομείς εφαρμογής στην υπολογιστική βιολογία]
bull Επεξεργασία κειμένου - αλφαριθμητικών [ανάλυση ακολουθιών δια-χείριση ΒΔ]
bull Εύκολος προγραμματισμός διαδικτυακών εφαρμογών [web services ΒΔ]
bull Λογισμικές επεκτάσεις (modules) ελεύθερες προς χρήση [BioPerl]
bull Υψηλές δυνατότητες διαχείρισης διαδικασιών (processes) [διαχείρισησυστημάτων]
Επίσης ορισμένα γενικά χαρακτηριστικά όπως
bull Εύκολη εκμάθηση
bull Εύκολη και γρήγορη συγγραφή μικρών και απλών προγραμμάτων 4
112 Το απόφθεγμα της Perl TMTOWTDI
ʻThere is More Than One Way To Do Itʼ hellip
Αν θα ήθελε κανείς να είναι συνεπής με το απόφθεγμα της Perl θα έπρεπενα δαπανήσει πολύ μεγάλο χρόνο για να παραθέσει τις διαφορετικές ισοδύ-ναμες περιπτώσεις με τις οποίες μπορούν να υλοποιηθούν στην Perl ακόμηκαι οι απλές προγραμματιστικές ιδέες που θα αναπτυχθούν στο εισαγωγικόαυτό μάθημα
Προφανώς κατά τα συνήθη όλες οι laquoεπιστημονικά τεκμηριωμένεςraquo λύσειςθα θεωρούνται σωστές Απαιτείται αρκετή προσωπική προσπάθεια ώστε
3Χωρίς αυτό να σημαίνει ότι αποτελεί τη μοναδική γλώσσα προγραμματισμού που χρησι-μοποιείται Στην πραγματικότητα κάθε γλώσσα προγραμματισμού πρέπει να χρησιμοποιεί-ται σε εφαρμογές ανάλογα με τα πλεονεκτήματα που προσφέρει
4Παρόλα αυτά τίποτε δεν είναι τέλειο σε αυτή τη ζωή Ορισμένες εργασίες που απαι-τούν ταχείς και πολλούς υπολογισμούς είναι καλό να υλοποιούνται σε άλλες πιο κατάλληλεςγλώσσες προγραμματισμού
3
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
ΠΕΡΙΕΧΟΜΕΝΑ
111 Έλεγχος και επανάληψη 27if elsif else 27unless 28for 29while 30until 30do whileuntil 31Ιδιωματισμοί 31
112 Υποπρογράμματα - Subroutines 33Ειδικά υποπρογράμματα 35
113 Επέστρεψε βγες και πέθανε (return exit die) 35114 Ενότητες λογισμικού (modules) 36115 Διαδικασίες εισόδου-εξόδου (ΙΟ) 37
Παράμετροι προγραμμάτων από τη γραμμή εντολών 38Χρήση αρχείων 38
iv
Perl 1Η γλώσσα προγραμματισμού Perl έχει βρει πολλούς ακόλουθους και
φανατικούς υποστηρικτές στο χώρο της υπολογιστικής βιολογίαςκαι της βιοπληροφορικής Κύριοι λόγοι γιʼ αυτό είναι η γρήγορη ʻκα-
μπύλη μάθησηςʼ η οποία κατά κύριο λόγο οφείλεται
i στην απουσία strong typing 1 και
ii στην ενσωματωμένη δυνατότητα επεξεργασίας σειρών αλφαριθμητι-κών χαρακτήρων (strings) η οποία είναι εξαιρετικά χρήσιμη και βολικήγια την επεξεργασία αλληλουχιών βιολογικών μακρομορίων
Στο κεφάλαιο αυτό δίνονται τα βασικά εφόδια με τα οποία μπορείτε νααρχίσετε να εργάζεστε παραγωγικά με τη γλώσσα Perl και να αναπτύσσετεχρήσιμες εφαρμογές σε σύντομο χρονικό διάστημα
Προφανώς για όσους επιθυμούν να μυηθούν στα βαθύτερα μυστικά τηςγλώσσας απαιτείται να ανατρέξουν στη σχετική παρατιθέμενη βιβλιογρα-φία και (κυρίως) να αφιερώσουν αρκετές ώρες γράφοντας προγράμματα
1Αυτό βρίσκουν και ως μειονέκτημα και όσοι είναι ενάντιοι σε αυτή τη γλώσσα προγραμ-ματισμού
1
Perl
11 Εισαγωγή
Δεν προϋποτίθεται γνώση κάποιας γλώσσας προγραμματισμού (αν και αυτόθα μπορούσε να βοηθήσει πολύ στη γρήγορη εκμάθηση της Perl)
Θεωρείται ότι ο αναγνώστης έχει τουλάχιστον βασικές γνώσεις αρχιτεκτο-νικής ΗΥ (βασικά χαρακτηριστικά ΗΥ αρχεία συστήματα διαχείρισης αρ-χείων)
111 Λίγα ιστορικά στοιχεία
Η γλώσσα προγραμματισμού Perl σχεδιάστηκε από τον Larry Wall και ο πη-γαίος κώδικας της πρώτης έκδοσής της έγινε διαθέσιμος στο κοινό το ∆εκέμ-βριο του 1987 Η τελευταία σταθερή έκδοση της γλώσσας σήμερα είναι η510 ενώ εδώ και καιρό σχεδιάζεται η έκδοση 6 με υλοποίηση σημαντικώνβελτιώσεων και προσθηκών
Βασική προσδοκία των ανθρώπων που ασχολούνται με την ανάπτυξη τηςγλώσσας Perl αποτέλεσε εξαρχής η παροχή ιδιαίτερων δυνατοτήτων στηνεπεξεργασία αρχείων κειμένου δηλαδή για την
bull Εύκολη εξαγωγή πληροφοριών
bull Προσαρμοσμένη εκτύπωση αναφορών με τα αποτελέσματα επεξεργα-σίας
Τα παραπάνω στοιχεία δικαιολογούν το ακρωνύμιο Practical Extraction andReport Language στο οποίο κατά μία εκδοχή οφείλεται το όνομα αυτής τηςγλώσσας προγραμματισμού2 Παρόλα αυτά η προσθήκη πολλών χαρακτη-ριστικών καθιστούν την Perl κατάλληλη για αρκετές άλλες εργασίες όπωςγια παράδειγμα η διαχείριση συστημάτων και η ανάπτυξη διαδικτυακώνεφαρμογών
Όσον αφορά στο σχεδιασμό της η Perl παρέχει επιλεγμένα χαρακτηριστικάʻπαραδοσιακώνʼ γλωσσών προγραμματισμού όπως η C (με την οποία μοιά-ζει σημαντικά στο ʻσυντακτικόʼ) και (λιγότερο) η Pascal (ή για τους περισ-σότερο μυημένους η AWK η sed ή η γλώσσα sh του κελύφους του UNIX)
2Αν και ο ίδιος ο Wall αναφέρει χαριτολογώντας και το Pathologically Eclectic Rubbish Lister
2
Εισαγωγή
Επιπλέον η δυνατότητα αντικειμενοστρεφούς (object oriented) προγραμμα-τισμού με την Perl την κατατάσσει δίπλα σε ʻμοντέρνεςʼ γλώσσες όπως ηC++ και η JAVA
H Perl έχει αποκτήσει μια βάση φανατικών οπαδών που προέρχονται απότο πεδίο της βιοπληροφορικής και της υπολογιστικής βιολογίας 3 Τα χα-ρακτηριστικά της γλώσσας στα οποία οφείλεται αυτή η εξάπλωσή της είναι[σε άγκιστρα τομείς εφαρμογής στην υπολογιστική βιολογία]
bull Επεξεργασία κειμένου - αλφαριθμητικών [ανάλυση ακολουθιών δια-χείριση ΒΔ]
bull Εύκολος προγραμματισμός διαδικτυακών εφαρμογών [web services ΒΔ]
bull Λογισμικές επεκτάσεις (modules) ελεύθερες προς χρήση [BioPerl]
bull Υψηλές δυνατότητες διαχείρισης διαδικασιών (processes) [διαχείρισησυστημάτων]
Επίσης ορισμένα γενικά χαρακτηριστικά όπως
bull Εύκολη εκμάθηση
bull Εύκολη και γρήγορη συγγραφή μικρών και απλών προγραμμάτων 4
112 Το απόφθεγμα της Perl TMTOWTDI
ʻThere is More Than One Way To Do Itʼ hellip
Αν θα ήθελε κανείς να είναι συνεπής με το απόφθεγμα της Perl θα έπρεπενα δαπανήσει πολύ μεγάλο χρόνο για να παραθέσει τις διαφορετικές ισοδύ-ναμες περιπτώσεις με τις οποίες μπορούν να υλοποιηθούν στην Perl ακόμηκαι οι απλές προγραμματιστικές ιδέες που θα αναπτυχθούν στο εισαγωγικόαυτό μάθημα
Προφανώς κατά τα συνήθη όλες οι laquoεπιστημονικά τεκμηριωμένεςraquo λύσειςθα θεωρούνται σωστές Απαιτείται αρκετή προσωπική προσπάθεια ώστε
3Χωρίς αυτό να σημαίνει ότι αποτελεί τη μοναδική γλώσσα προγραμματισμού που χρησι-μοποιείται Στην πραγματικότητα κάθε γλώσσα προγραμματισμού πρέπει να χρησιμοποιεί-ται σε εφαρμογές ανάλογα με τα πλεονεκτήματα που προσφέρει
4Παρόλα αυτά τίποτε δεν είναι τέλειο σε αυτή τη ζωή Ορισμένες εργασίες που απαι-τούν ταχείς και πολλούς υπολογισμούς είναι καλό να υλοποιούνται σε άλλες πιο κατάλληλεςγλώσσες προγραμματισμού
3
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl 1Η γλώσσα προγραμματισμού Perl έχει βρει πολλούς ακόλουθους και
φανατικούς υποστηρικτές στο χώρο της υπολογιστικής βιολογίαςκαι της βιοπληροφορικής Κύριοι λόγοι γιʼ αυτό είναι η γρήγορη ʻκα-
μπύλη μάθησηςʼ η οποία κατά κύριο λόγο οφείλεται
i στην απουσία strong typing 1 και
ii στην ενσωματωμένη δυνατότητα επεξεργασίας σειρών αλφαριθμητι-κών χαρακτήρων (strings) η οποία είναι εξαιρετικά χρήσιμη και βολικήγια την επεξεργασία αλληλουχιών βιολογικών μακρομορίων
Στο κεφάλαιο αυτό δίνονται τα βασικά εφόδια με τα οποία μπορείτε νααρχίσετε να εργάζεστε παραγωγικά με τη γλώσσα Perl και να αναπτύσσετεχρήσιμες εφαρμογές σε σύντομο χρονικό διάστημα
Προφανώς για όσους επιθυμούν να μυηθούν στα βαθύτερα μυστικά τηςγλώσσας απαιτείται να ανατρέξουν στη σχετική παρατιθέμενη βιβλιογρα-φία και (κυρίως) να αφιερώσουν αρκετές ώρες γράφοντας προγράμματα
1Αυτό βρίσκουν και ως μειονέκτημα και όσοι είναι ενάντιοι σε αυτή τη γλώσσα προγραμ-ματισμού
1
Perl
11 Εισαγωγή
Δεν προϋποτίθεται γνώση κάποιας γλώσσας προγραμματισμού (αν και αυτόθα μπορούσε να βοηθήσει πολύ στη γρήγορη εκμάθηση της Perl)
Θεωρείται ότι ο αναγνώστης έχει τουλάχιστον βασικές γνώσεις αρχιτεκτο-νικής ΗΥ (βασικά χαρακτηριστικά ΗΥ αρχεία συστήματα διαχείρισης αρ-χείων)
111 Λίγα ιστορικά στοιχεία
Η γλώσσα προγραμματισμού Perl σχεδιάστηκε από τον Larry Wall και ο πη-γαίος κώδικας της πρώτης έκδοσής της έγινε διαθέσιμος στο κοινό το ∆εκέμ-βριο του 1987 Η τελευταία σταθερή έκδοση της γλώσσας σήμερα είναι η510 ενώ εδώ και καιρό σχεδιάζεται η έκδοση 6 με υλοποίηση σημαντικώνβελτιώσεων και προσθηκών
Βασική προσδοκία των ανθρώπων που ασχολούνται με την ανάπτυξη τηςγλώσσας Perl αποτέλεσε εξαρχής η παροχή ιδιαίτερων δυνατοτήτων στηνεπεξεργασία αρχείων κειμένου δηλαδή για την
bull Εύκολη εξαγωγή πληροφοριών
bull Προσαρμοσμένη εκτύπωση αναφορών με τα αποτελέσματα επεξεργα-σίας
Τα παραπάνω στοιχεία δικαιολογούν το ακρωνύμιο Practical Extraction andReport Language στο οποίο κατά μία εκδοχή οφείλεται το όνομα αυτής τηςγλώσσας προγραμματισμού2 Παρόλα αυτά η προσθήκη πολλών χαρακτη-ριστικών καθιστούν την Perl κατάλληλη για αρκετές άλλες εργασίες όπωςγια παράδειγμα η διαχείριση συστημάτων και η ανάπτυξη διαδικτυακώνεφαρμογών
Όσον αφορά στο σχεδιασμό της η Perl παρέχει επιλεγμένα χαρακτηριστικάʻπαραδοσιακώνʼ γλωσσών προγραμματισμού όπως η C (με την οποία μοιά-ζει σημαντικά στο ʻσυντακτικόʼ) και (λιγότερο) η Pascal (ή για τους περισ-σότερο μυημένους η AWK η sed ή η γλώσσα sh του κελύφους του UNIX)
2Αν και ο ίδιος ο Wall αναφέρει χαριτολογώντας και το Pathologically Eclectic Rubbish Lister
2
Εισαγωγή
Επιπλέον η δυνατότητα αντικειμενοστρεφούς (object oriented) προγραμμα-τισμού με την Perl την κατατάσσει δίπλα σε ʻμοντέρνεςʼ γλώσσες όπως ηC++ και η JAVA
H Perl έχει αποκτήσει μια βάση φανατικών οπαδών που προέρχονται απότο πεδίο της βιοπληροφορικής και της υπολογιστικής βιολογίας 3 Τα χα-ρακτηριστικά της γλώσσας στα οποία οφείλεται αυτή η εξάπλωσή της είναι[σε άγκιστρα τομείς εφαρμογής στην υπολογιστική βιολογία]
bull Επεξεργασία κειμένου - αλφαριθμητικών [ανάλυση ακολουθιών δια-χείριση ΒΔ]
bull Εύκολος προγραμματισμός διαδικτυακών εφαρμογών [web services ΒΔ]
bull Λογισμικές επεκτάσεις (modules) ελεύθερες προς χρήση [BioPerl]
bull Υψηλές δυνατότητες διαχείρισης διαδικασιών (processes) [διαχείρισησυστημάτων]
Επίσης ορισμένα γενικά χαρακτηριστικά όπως
bull Εύκολη εκμάθηση
bull Εύκολη και γρήγορη συγγραφή μικρών και απλών προγραμμάτων 4
112 Το απόφθεγμα της Perl TMTOWTDI
ʻThere is More Than One Way To Do Itʼ hellip
Αν θα ήθελε κανείς να είναι συνεπής με το απόφθεγμα της Perl θα έπρεπενα δαπανήσει πολύ μεγάλο χρόνο για να παραθέσει τις διαφορετικές ισοδύ-ναμες περιπτώσεις με τις οποίες μπορούν να υλοποιηθούν στην Perl ακόμηκαι οι απλές προγραμματιστικές ιδέες που θα αναπτυχθούν στο εισαγωγικόαυτό μάθημα
Προφανώς κατά τα συνήθη όλες οι laquoεπιστημονικά τεκμηριωμένεςraquo λύσειςθα θεωρούνται σωστές Απαιτείται αρκετή προσωπική προσπάθεια ώστε
3Χωρίς αυτό να σημαίνει ότι αποτελεί τη μοναδική γλώσσα προγραμματισμού που χρησι-μοποιείται Στην πραγματικότητα κάθε γλώσσα προγραμματισμού πρέπει να χρησιμοποιεί-ται σε εφαρμογές ανάλογα με τα πλεονεκτήματα που προσφέρει
4Παρόλα αυτά τίποτε δεν είναι τέλειο σε αυτή τη ζωή Ορισμένες εργασίες που απαι-τούν ταχείς και πολλούς υπολογισμούς είναι καλό να υλοποιούνται σε άλλες πιο κατάλληλεςγλώσσες προγραμματισμού
3
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
11 Εισαγωγή
Δεν προϋποτίθεται γνώση κάποιας γλώσσας προγραμματισμού (αν και αυτόθα μπορούσε να βοηθήσει πολύ στη γρήγορη εκμάθηση της Perl)
Θεωρείται ότι ο αναγνώστης έχει τουλάχιστον βασικές γνώσεις αρχιτεκτο-νικής ΗΥ (βασικά χαρακτηριστικά ΗΥ αρχεία συστήματα διαχείρισης αρ-χείων)
111 Λίγα ιστορικά στοιχεία
Η γλώσσα προγραμματισμού Perl σχεδιάστηκε από τον Larry Wall και ο πη-γαίος κώδικας της πρώτης έκδοσής της έγινε διαθέσιμος στο κοινό το ∆εκέμ-βριο του 1987 Η τελευταία σταθερή έκδοση της γλώσσας σήμερα είναι η510 ενώ εδώ και καιρό σχεδιάζεται η έκδοση 6 με υλοποίηση σημαντικώνβελτιώσεων και προσθηκών
Βασική προσδοκία των ανθρώπων που ασχολούνται με την ανάπτυξη τηςγλώσσας Perl αποτέλεσε εξαρχής η παροχή ιδιαίτερων δυνατοτήτων στηνεπεξεργασία αρχείων κειμένου δηλαδή για την
bull Εύκολη εξαγωγή πληροφοριών
bull Προσαρμοσμένη εκτύπωση αναφορών με τα αποτελέσματα επεξεργα-σίας
Τα παραπάνω στοιχεία δικαιολογούν το ακρωνύμιο Practical Extraction andReport Language στο οποίο κατά μία εκδοχή οφείλεται το όνομα αυτής τηςγλώσσας προγραμματισμού2 Παρόλα αυτά η προσθήκη πολλών χαρακτη-ριστικών καθιστούν την Perl κατάλληλη για αρκετές άλλες εργασίες όπωςγια παράδειγμα η διαχείριση συστημάτων και η ανάπτυξη διαδικτυακώνεφαρμογών
Όσον αφορά στο σχεδιασμό της η Perl παρέχει επιλεγμένα χαρακτηριστικάʻπαραδοσιακώνʼ γλωσσών προγραμματισμού όπως η C (με την οποία μοιά-ζει σημαντικά στο ʻσυντακτικόʼ) και (λιγότερο) η Pascal (ή για τους περισ-σότερο μυημένους η AWK η sed ή η γλώσσα sh του κελύφους του UNIX)
2Αν και ο ίδιος ο Wall αναφέρει χαριτολογώντας και το Pathologically Eclectic Rubbish Lister
2
Εισαγωγή
Επιπλέον η δυνατότητα αντικειμενοστρεφούς (object oriented) προγραμμα-τισμού με την Perl την κατατάσσει δίπλα σε ʻμοντέρνεςʼ γλώσσες όπως ηC++ και η JAVA
H Perl έχει αποκτήσει μια βάση φανατικών οπαδών που προέρχονται απότο πεδίο της βιοπληροφορικής και της υπολογιστικής βιολογίας 3 Τα χα-ρακτηριστικά της γλώσσας στα οποία οφείλεται αυτή η εξάπλωσή της είναι[σε άγκιστρα τομείς εφαρμογής στην υπολογιστική βιολογία]
bull Επεξεργασία κειμένου - αλφαριθμητικών [ανάλυση ακολουθιών δια-χείριση ΒΔ]
bull Εύκολος προγραμματισμός διαδικτυακών εφαρμογών [web services ΒΔ]
bull Λογισμικές επεκτάσεις (modules) ελεύθερες προς χρήση [BioPerl]
bull Υψηλές δυνατότητες διαχείρισης διαδικασιών (processes) [διαχείρισησυστημάτων]
Επίσης ορισμένα γενικά χαρακτηριστικά όπως
bull Εύκολη εκμάθηση
bull Εύκολη και γρήγορη συγγραφή μικρών και απλών προγραμμάτων 4
112 Το απόφθεγμα της Perl TMTOWTDI
ʻThere is More Than One Way To Do Itʼ hellip
Αν θα ήθελε κανείς να είναι συνεπής με το απόφθεγμα της Perl θα έπρεπενα δαπανήσει πολύ μεγάλο χρόνο για να παραθέσει τις διαφορετικές ισοδύ-ναμες περιπτώσεις με τις οποίες μπορούν να υλοποιηθούν στην Perl ακόμηκαι οι απλές προγραμματιστικές ιδέες που θα αναπτυχθούν στο εισαγωγικόαυτό μάθημα
Προφανώς κατά τα συνήθη όλες οι laquoεπιστημονικά τεκμηριωμένεςraquo λύσειςθα θεωρούνται σωστές Απαιτείται αρκετή προσωπική προσπάθεια ώστε
3Χωρίς αυτό να σημαίνει ότι αποτελεί τη μοναδική γλώσσα προγραμματισμού που χρησι-μοποιείται Στην πραγματικότητα κάθε γλώσσα προγραμματισμού πρέπει να χρησιμοποιεί-ται σε εφαρμογές ανάλογα με τα πλεονεκτήματα που προσφέρει
4Παρόλα αυτά τίποτε δεν είναι τέλειο σε αυτή τη ζωή Ορισμένες εργασίες που απαι-τούν ταχείς και πολλούς υπολογισμούς είναι καλό να υλοποιούνται σε άλλες πιο κατάλληλεςγλώσσες προγραμματισμού
3
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Εισαγωγή
Επιπλέον η δυνατότητα αντικειμενοστρεφούς (object oriented) προγραμμα-τισμού με την Perl την κατατάσσει δίπλα σε ʻμοντέρνεςʼ γλώσσες όπως ηC++ και η JAVA
H Perl έχει αποκτήσει μια βάση φανατικών οπαδών που προέρχονται απότο πεδίο της βιοπληροφορικής και της υπολογιστικής βιολογίας 3 Τα χα-ρακτηριστικά της γλώσσας στα οποία οφείλεται αυτή η εξάπλωσή της είναι[σε άγκιστρα τομείς εφαρμογής στην υπολογιστική βιολογία]
bull Επεξεργασία κειμένου - αλφαριθμητικών [ανάλυση ακολουθιών δια-χείριση ΒΔ]
bull Εύκολος προγραμματισμός διαδικτυακών εφαρμογών [web services ΒΔ]
bull Λογισμικές επεκτάσεις (modules) ελεύθερες προς χρήση [BioPerl]
bull Υψηλές δυνατότητες διαχείρισης διαδικασιών (processes) [διαχείρισησυστημάτων]
Επίσης ορισμένα γενικά χαρακτηριστικά όπως
bull Εύκολη εκμάθηση
bull Εύκολη και γρήγορη συγγραφή μικρών και απλών προγραμμάτων 4
112 Το απόφθεγμα της Perl TMTOWTDI
ʻThere is More Than One Way To Do Itʼ hellip
Αν θα ήθελε κανείς να είναι συνεπής με το απόφθεγμα της Perl θα έπρεπενα δαπανήσει πολύ μεγάλο χρόνο για να παραθέσει τις διαφορετικές ισοδύ-ναμες περιπτώσεις με τις οποίες μπορούν να υλοποιηθούν στην Perl ακόμηκαι οι απλές προγραμματιστικές ιδέες που θα αναπτυχθούν στο εισαγωγικόαυτό μάθημα
Προφανώς κατά τα συνήθη όλες οι laquoεπιστημονικά τεκμηριωμένεςraquo λύσειςθα θεωρούνται σωστές Απαιτείται αρκετή προσωπική προσπάθεια ώστε
3Χωρίς αυτό να σημαίνει ότι αποτελεί τη μοναδική γλώσσα προγραμματισμού που χρησι-μοποιείται Στην πραγματικότητα κάθε γλώσσα προγραμματισμού πρέπει να χρησιμοποιεί-ται σε εφαρμογές ανάλογα με τα πλεονεκτήματα που προσφέρει
4Παρόλα αυτά τίποτε δεν είναι τέλειο σε αυτή τη ζωή Ορισμένες εργασίες που απαι-τούν ταχείς και πολλούς υπολογισμούς είναι καλό να υλοποιούνται σε άλλες πιο κατάλληλεςγλώσσες προγραμματισμού
3
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
να αρχίσετε να θεωρείτε φυσικές αρκετές από τις εναλλακτικές λύσεις καιπροσεγγίσεις σε συγκεκριμένα πρακτικά προβλήματα
12 Τεχνικές συμβουλές και συμβάσεις
Στο κεφάλαιο αυτό χρησιμοποιούνται πολλές συμβάσεις για την παράθεσηλειτουργικού κώδικα και επεξηγηματικού υλικού Οποιοδήποτε τμήμα κώ-δικα εισάγεται εμβόλιμο στο κείμενο εμφανίζεται με διαφορετική γραμμα-τοσειρά πχ my $x=5 Οδηγίες που περνάμε στη γραμμή εντολών εμφανί-ζονται με γραμματοσειρά typewriter ξεκινώντας με το χαρακτήρα ʼgtʼπχgtcd PerlScripts Εκτενή τμήματα κώδικα ή τμήματα κώδικα στα οποίαδίνεται έμφαση παρατίθενται
usrbinperl -w This is a commentuse strict Always use the strict pragma in your codeuse warnings Always use the warnings pragma in your codemy $x = rdquofoordquo This is a Perl assignmentprint $x rdquonrdquo Print out rdquofoordquo and newline
ενώ ολοκληρωμένα τμήματα αυτόνομου κώδικα (πχ συναρτήσεις) παρου-σιάζονται σε ειδικά πλαίσια κώδικα όπως φαίνεται στο πλαίσιο κώδικα11
Κώδικας 11 Hello world usrbinperl minuswuse s t r i c t important pragmause warnings another important pragmaprint rdquoWhatisyourusernamerdquo print out the questionmy $username rdquo declare rdquo the variable$username = ltSTDINgt ask for the usernamechomp($username ) remove rdquonew l ine rdquopr int rdquoHello$usernamenrdquo print out the greeting Now we have said hello to our user
Υπό κανονικές συνθήκες (δηλαδή εάν δεν αναφέρεται κάτι διαφορετικό) οκώδικας αυτών των παραδειγμάτων είναι εκτελέσιμος και ορθός Τα σχό-λια του κώδικα δίνουν πληροφορίες για τη λειτουργικότητα των διάφο-
4
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Τεχνικές συμβουλές και συμβάσεις
ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 17)
ΣημείωσηΣτα πλαίσια του κεφαλαίου αυτού θα θεωρούμε ότι δουλεύουμε σε περιβάλλονUNIXLINUX εκτός και εάν αναφέρεται ρητά κάτι διαφορετικό Ο υπολογιστής στονοποίο θα εργαζόμαστε θα έχει το ψευδώνυμο ajax και το prompt της γραμμής εντο-λών θα είναι userajax~path_to_my_current_directorygt
121 Μεταγλωττιζόμενες και διερμηνευόμενες γλώσσες προγραμματι-σμού
Τα κυκλώματα των ψηφιακών ηλεκτρονικών υπολογιστών λειτουργούν μεβάση το δυαδικό σύστημα πληροφορίες κωδικοποιούνται σε ηλεκτρονικάστοιχεία τα οποία μπορούν να λάβουν (πρακτικά) τις τιμές 0 ή 1 Ένα τέτοιοστοιχείο μπορεί να αποθηκεύσει το μικρότερο δυνατό ποσό πληροφορίαςκαι ονομάζεται bit (Binary digIT) Ένα λογισμικό δεν είναι τίποτε άλλο παράένα σύνολο οδηγιών οι οποίες καθοδηγούν τον υπολογιστή να προβαίνεισε συγκεκριμένες λειτουργίες Οι οδηγίες αυτές κωδικοποιούνται σε δυαδικήμορφή ώστε να γίνονται αντιληπτές και εκτελέσιμες από τον ΗΥ
Κάθε γλώσσα προγραμματισμού παρέχει στους προγραμματιστές ένα σύ-νολο εντολών οι οποίες εν γένει είναι μνημονικές Ο κώδικας του λογισμικούγράφεται με τρόπο κατανοητό από τον προγραμματιστή σε μορφή κειμένου(αρχείο πηγαίου κώδικα - source code) το οποίο φυσικά δεν είναι ldquoκατανο-ητόrdquo (εκτελέσιμο) από τον ΗΥ Ο πηγαίος κώδικας πρέπει να μεταφραστείσε δυαδικές εντολές και ανάλογα με τον τρόπο με τον οποίο επιτυγχάνεταιαυτό οι γλώσσες προγραμματισμού κατηγοριοποιούνται σε
Μεταγλωττιζόμενες ή μεταφραζόμενες (compiled) Με τη βοήθεια ενός ει-δικού λογισμικού (μεταγλωττιστής ή μεταφραστής) ο πηγαίος κώδικαςμετατρέπεται σε εκτελέσιμο δυαδικό αρχείο στο σύνολό του
Διερμηνευόμενες (interpreted) Με τη βοήθεια ενός ειδικού λογισμικού (διερ-μηνευτής) ο πηγαίος κώδικας εκτελείται γραμμή - γραμμή χωρίς τηνκατασκευή εκτελέσιμου αρχείου
Τόσο οι μεταγλωττιζόμενες όσο και οι διερμηνευόμενες γλώσσες προγραμ-
5
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
ματισμού είναι δυνατόν να παρουσιάζουν πλεονεκτήματα αλλά και μειονε-κτήματα εξαιτίας της φύσης τους
122 Ο διερμηνευτής της Perl
Ο πηγαίος κώδικας των προγραμμάτων της Perl δε μεταφράζεται σε γλώσσαμηχανής αλλά σε μια ενδιάμεση μορφή η οποία είναι εκτελέσιμη από την ίδιατην Perl η οποία στη συνέχεια τα εκτελεί Φαινομενικά όμως η Perl μοιάζειμε διερμηνευόμενη γλώσσα Στα πλαίσια του μαθήματος αυτού λοιπόν θαακολουθούμε αυτήν την παραδοχή και θα αναφερόμαστε παρότι αυτό δενακριβολογεί στον ∆ιερμηνευτή της Perl
∆ιερμηνευτές της Perl υπάρχουν για όλα πρακτικά τα λειτουργικά συστή-ματα Το γεγονός αυτό σε συνδυασμό με την ελεύθερη διάθεση του ίδιου του∆ιερμηνευτή (httpwwwperlcom) αλλά και πλήθους βιβλιοθηκών λογισμι-κού (modules δείτε το URL httpwwwcpanorg Comprehensive Perl ArchiveNetwork-CPAN) όπως και η μεγάλη ευκαμψία της γλώσσας την καθιστούνολοένα και περισσότερο δημοφιλή στους κύκλους τόσο των προχωρημένωνόσο και των αρχάριων προγραμματιστών
Εκτέλεση προγραμμάτων
Σε πλήρη αντιστοιχία με όσα ήδη γνωρίζετε από τη γλώσσα προγραμματι-σμού C αρκεί να γραφεί ο πηγαίος κώδικας ενός προγράμματος σε μορφήαπλού ASCII κειμένου Για την εκτέλεση του προγράμματος πρέπει να κλη-θεί με κατάλληλο τρόπο ο ∆ιερμηνευτής της γλώσσας γεγονός που μπο-ρεί να γίνει άμεσα ή έμμεσα όπως θα δούμε αμέσως μετά Στην περίπτωσηπου η μεταβλητή του περιβάλλοντος εργασίας PATH έχει ρυθμιστεί ώστε ναπεριλαμβάνει τον κατάλογο στον οποίο βρίσκεται το εκτελέσιμο αρχείο του∆ιερμηνευτή της Perl μπορούμε απλά να πληκτρολογήσουμε
Κώδικας 12 Hello worlduserajax~gtperlpr int rdquoHelloWorldIamlearningperlforbioinformaticsapplicationsnrdquo CTRL+D
6
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Τεχνικές συμβουλές και συμβάσεις
οπότε στο τερματικό μας τυπώνεται το μήνυμα
Κώδικας 13 Hello worldHello World I am learning perl for bioinformatics applications userajax~gt
Ακριβώς η ίδια λειτουργικότητα θα μπορούσε να επιτευχθεί ως εξής
Κώδικας 14 Hello worlduserajax~gtcat gt myscript pl crarrprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtperl myscript pl crarr
Στις δύο περιπτώσεις η κλήση του ∆ιερμηνευτή της Perl γίνεται άμεσα
Η έμμεση κλήση του ∆ιερμηνευτή μπορεί να επιτευχθεί με τον ακόλουθο τρόπο5
Κώδικας 15 Hello worlduserajax~gtcat gt myscript2 pl crarr usrbinperl minuswprint ldquoHello Worldrdquon crarrCTRL+Duserajax~gtchmod 700 myscript2 pl crarruserajax~gtmyscript2 pl
Η κατάληξη pl χρησιμοποιείται κατά παράδοση για αρχεία πηγαίου κώδικασε γλώσσα Perl αλλά δεν είναι υποχρεωτική
Ο διερμηνευτής ελέγχει αρχικά την ορθότητα της σύνταξης του κώδικά μαςπριν προχωρήσει στην εκτέλεσή του
Για παράδειγμα προσπαθήστε να τρέξετε το ακόλουθο πρόγραμμα5Η πρώτη γραμμή του κώδικα (usrbinperl) δείχνει στο κέλυφος του UNIX ποιο πρό-
γραμμα θα διερμηνεύσει τις εντολές του αρχείου (myscript2pl) και αντιστοιχεί στο πλήρεςόνομα του εκτελέσιμου αρχείου του ∆ιερμηνευτή της Perl Εάν δουλεύετε σε σύστημα στοοποίο δε γνωρίζετε τη θέση στην οποία βρίσκεται ο ∆ιερμηνευτής μπορείτε να πληκτρο-λογήσετε στη γραμμή εντολών userazax~gtwhich perl Σημειώνεται ότι στην τελευταία πε-ρίπτωση το αρχείο με τον πηγαίο κώδικα πρέπει να είναι εκτελέσιμο (γιʼ αυτό και η γραμμήchmod 700 myscript2pl)
7
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
Κώδικας 16 Hello world2 usrbinperl minuswprint Hello world nrdquo
στο οποίο ένα από τα εισαγωγικά έχει επίτηδες παραληφθεί Διαπιστώστετι συμβαίνει
Δεν είναι αναγκαίο να μεταγλωττιστεί το πρόγραμμα πριν την εκτέλεση (δηλγια την παραγωγή μεταφρασμένου δυαδικού κώδικα) αν και αυτό είναι δυ-νατόν
Επιπλέον όπως και σε πολλά άλλα προγράμματα που εκτελούνται από τηγραμμή εντολών έτσι και ο ∆ιερμηνευτής της Perl μπορεί να κληθεί με διάφο-ρους ʻδιακόπτεςʼ οι οποίοι τροποποιούν με τον επιθυμητό τρόπο τη συμπε-ριφορά του Για παράδειγμα με το διακόπτη ndashe είναι δυνατόν να γράψουμεπρογράμματα Perl στη γραμμή εντολών Έτσι αν πληκτρολογήσουμε
userajax~gtperl ndashe ʻprint rdquoHelloWorldnrdquoʼ crarr
παίρνουμε το ίδιο αποτέλεσμα με τις προηγούμενες μας προσπάθειες 6
6Στα πλαίσια της εισαγωγής αυτής θα αναφερθούμε σε ελάχιστους από τους διαθέσιμουςδιακόπτες Για περισσότερες πληροφορίες μπορείτε να χρησιμοποιήσετε την παρεχόμενη βο-ήθεια καλώντας το ∆ιερμηνευτή της Perl με το διακόπτη ndashh
8
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Τεχνικές συμβουλές και συμβάσεις
ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην Perl από εδώ και στο εξής καλό θαείναι να ακολουθούμε ευλαβικά τους εξής κανόνες
1 Θα ξεκινάμε την πρώτη γραμμή του προγράμματος με το πλήρες όνομα τουαρχείου του ∆ιερμηνευτή της Perl αʹ (πχ usrbinperl)
2 Ο ∆ιερμηνευτής θα καλείται πάντα με το διακόπτη -w (δηλusrbinperl minusw) Κατά αυτόν τον τρόπο ο ∆ιερμηνευτής δίνει στην έξοδοενημερωτικά διαγνωστικά μηνύματα τα οποία μπορεί να προφυλάξουν απόπιθανά λογικά λάθη του προγράμματος
3 Στη δεύτερη γραμμή του κώδικα θα εισάγουμε το κείμενοuse strictΗ δήλωση αυτή καλεί το ∆ιερμηνευτή της γλώσσας να χρησιμοποιήσει τοpragmaβʹ με το όνομα strict ενεργοποιώντας αυστηρούς ελέγχους κατά τηδιάρκεια της μεταγλώττισης και εκτέλεσης του προγράμματος οι οποίοιόταν αποτυγχάνουν οδηγούν σε τερματισμό του προγράμματος σε κατάστασησφάλματοςγʹ
αʹΣε ορισμένα συστήματα UNIX (πχ SGI-IRIX) παρέχεται η εντολή env η οποίαπαίρνει ως όρισμα το όνομα ενός εκτελέσιμου αρχείου και επιστρέφει το πλήρεςόνομα του Άρα η πρώτη γραμμή του αρχείου πηγαίου κώδικα θα μπορούσε εναλ-λακτικά να είναι binenv perl
βʹpragma (πληθ pragmata) ∆εν είναι τίποτε άλλο παρά βιβλιοθήκες της γλώσσας(Pragmatic Modules) οι οποίες δίνουν οδηγίες και τροποποιούν τη συμπεριφορά του∆ιερμηνευτή τόσο κατά το χρόνο μεταγλώττισης όσο και κατά το χρόνο εκτέλεσης
γʹΓια περισσότερες λεπτομέρειες εκτελέστε userazax~gtperldoc strict Αν δεν κα-ταλαβαίνετε αρκετά από όσα εμφανίζονται στο τερματικό σας μην πτοείστε αλλάπρογραμματίστε να επανέλθετε μετά από μερικές εβδομάδες
123 Μορφοποίηση προγράμματος
bull Η Perl παρέχει μεγάλη ελευθερία στη μορφοποίηση του πηγαίου κώδικαΑυτό σημαίνει ότι (εκτός από λίγες σχετικά εξαιρέσεις) μπορούμε βαπροσθέτουμε κενά στηλοθέτες (tabs) ή αλλαγές γραμμής οπουδήποτεεπιθυμούμε
bull Η Perl δίνει την ευκαιρία να γράφει κανείς πολύ ldquoκρυψινοϊκόrdquo κώδικαΚαλή πρακτική είναι να το αποφεύγουμε αυτό ιδίως όταν πρόκειται ναμοιραστούμε τον κώδικά μας με άλλους χρησιμοποιώντας μια γραμμήγια κάθε δήλωση και τοποθετώντας σωστά τους στηλοθέτες σε φω-λιασμένες δομές
bull Αν και δεν είναι υποχρεωτικό η χρήση σχολίων (μετά από το χαρακτήρα
9
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
) μπορεί να βοηθήσει στην ανάγνωση και κατανόηση του κώδικά μαςτόσο από συνεργάτες μας όσο και από εμάς τους ίδιους7
Κώδικας 17 MinMax usrbinperl minusw
A small program to find min max and average of a l i s t of numbers Disregard code just pay attention to the format
my data = (43 21 98 5 17 52 110 80)my $min = 10000my $max = 0my ($sum $number_of_items )
I te ra te over numbers
print rdquoCalculationsnrdquo foreach $n (data )
$number_of_items++ add 1 to number of items$sum += $n add $n to $sumi f ($n gt $max) find max
print rdquo$nwaslargerthan$maxnrdquo $max = $n
find mini f ($n lt $min)
pr int rdquo$nwassmallerthan$minnrdquo $min = $n
Calculate average and display resut ls
my $average = $sum $number_of_items calc averageprint rdquonResultsnrdquo
rdquoDatardquo jo in (rdquordquo data ) rdquonrdquo print resultsrdquoMinimum$minnrdquo rdquoMaximum$maxnrdquo rdquoAverage$averagenrdquo
Κώδικας 18 Sum7Φανταστείτε να μελετάτε το αρχείο πηγαίου κώδικα με 100+ γραμμές που γράψατε πριν
από 1 χρόνο
10
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Μεταβλητές στην Perl
usrbinperl minusw
$a = 2$b = 5$result = $a + $b calculate sumprint rdquoResultis$resultnrdquo print i t
Παρατηρήστε ότι
bull Κάθε δήλωση τερματίζεται με το χαρακτήρα (ελληνικό ερωτηματικό)
bull Οι παραστάσεις $a $b and $result στο τελευταίο παράδειγμα είναι μετα-βλητές
Μια μεταβλητή αποτελεί ένα κατασκεύασμα της γλώσσας το οποίο μαςδίνει τη δυνατότητα αποθήκευσης μίας ή περισσότερων τιμών Στο συγ-κεκριμένο παράδειγμα οι τιμές 2 και 5 είναι οι (προσωρινές) τιμές πουαποθηκεύονται στις μεταβλητές $a $b
bull Ο τελεστής = χρησιμοποιείται για την ανάθεση τιμής σε μια μεταβλητή
bull Η δήλωση print χρησιμοποιείται για να τυπώσουμε τις τιμές μεταβλητών(ή και σταθερών τιμών) στο αρχείο προκαθορισμένης εξόδου (STDOUT)
bull Ο συμβολισμός n υποδηλώνει το χαρακτήρα αλλαγής γραμμής
Κώδικας 19 Instructor
usrbinperl minusw
$teacher = rdquoVasilisJPromponasrdquo $course = rdquoBIO331rdquo pr int rdquo$teacherteaches$coursenrdquo
13 Μεταβλητές στην Perl
11
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
131 Μεταβλητές
Οι μεταβλητές από τη μεριά του προγραμματιστή είναι οι οντότητες εκεί-νες στον πηγαίο κώδικα που γράφει οι οποίες του επιτρέπουν να αποθηκεύειτιμές δεδομένων στη μνήμη του υπολογιστή κατά την εκτέλεση του προγράμ-ματος Αυτές οι τιμές στη συνέχεια μπορούν να ανακληθούν και είναι διαθέ-σιμες σε διάφορα τμήματα του προγράμματος ανάλογα με την εμβέλεια τηνοποία έχουν (scope) κάνοντας τα προγράμματα περισσότερο ευέλικτα απόότι θα ήταν αν τα δεδομένα εισάγονταν κάθε φορά με το ʻχέριʼ
Η Perl γενικά δεν απαιτεί τη δήλωση των μεταβλητών (σε αντίθεση με γλώσ-σες όπως η C) Αυτό βέβαια αποτελεί μεγάλη ευκολία και ορισμένες φορέςαυξάνει δραματικά την παραγωγικότητα ενός προγραμματιστή καθώς τουδίνει μεγάλη ελευθερία έκφρασης Παρόλα αυτά όπως συμβαίνει συχνά στηΦύση το γεγονός αυτό δεν συμβαίνει χωρίς κανένα κόστος Είναι προφανέςότι όταν δεν δηλώνονται οι μεταβλητές τις οποίες έχουμε την πρόθεση ναχρησιμοποιήσουμε είναι πολύ εύκολο (δυστυχώς) να υποπέσουμε σε σφάλ-ματα σχετικά με την εμβέλεια τους ή και να χρησιμοποιούμε με το ίδιο όνομαδύο διαφορετικές () μεταβλητές οι οποίες κανονικά προορίζονται για δια-φορετική χρήση ιδίως σε προγράμματα με μακροσκελή πηγαίο κώδικα Ηχρήση των περιορισμών που αναφέρονται στη σημείωση της προηγούμενηςπαραγράφου επιβάλει την εκ των προτέρων δήλωση των μεταβλητών Σεμεγάλα προγράμματα οι περιορισμοί αυτοί από τη μια πλευρά ʻκοστίζουνʼσε χρόνο παράλληλα όμως μας γλιτώνουν από χρόνο για την αποσφαλμά-τωση (debugging) του κώδικά μας
Τα ονόματα των μεταβλητών ξεκινούν (όπως θα δούμε στα αμέσως επό-μενα) με έναν από τους ειδικούς χαρακτήρες8 $ και μπορεί να περιέχουνοποιοδήποτε συνδυασμό γραμμάτων αριθμητικών ψηφίων και το χαρα-κτήρα υπογράμμισης Η Perl χρησιμοποιεί ορισμένες προκαθορισμένες μετα-βλητές με laquoεξωτικάraquo ονόματα όπως $_ $ _ $^ $$ κλπ Στην τρέχουσα έκ-δοση του ∆ιερμηνευτή της Perl τα επιτρεπτά ονόματα μεταβλητών δεν έχουνπερισσότερους από 251 χαρακτήρες
8Προφανώς οι χαρακτήρες αυτοί δεν επιτρέπεται να βρίσκονται παρά μόνο στην πρώτηθέση του ονόματος της μεταβλητής
12
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Βαθμωτές (Scalar) Μεταβλητές
14 laquoΓράμματα και Αριθμοίraquo Βαθμωτές (Scalar) Μεταβλητές
Για την αποθήκευση-διαχείριση συμβολοσειρών (strings)9 και αριθμητικώνδεδομένων η Perl παρέχει ένα και μοναδικό τύπο τις μεταβλητές βαθμω-τού (scalar) τύπου τις οποίες και διαχειρίζεται με ενιαίο τρόπο Τα ονόματαβαθμωτών μεταβλητών ξεκινούν υποχρεωτικά με το χαρακτήρα $
Έτσι οι δηλώσεις
my $a = ldquo123rdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 246
Εσωτερικά οι αριθμητικές τιμές παριστάνονται με την αλφαριθμητική τουςαναπαράσταση και ανάλογα με τους τελεστές που εφαρμόζουμε στις βαθ-μωτές μεταβλητές η Perl καταλαβαίνει αν πρέπει να τις θεωρήσει ως αριθ-μητικές ή όχι Για παράδειγμα οι δηλώσεις
my $a = ldquoabcrdquomy $b = 123my $c = $a + $bprint $c
έχουν ως αποτέλεσμα να τυπώνεται στο τερματικό 123
Αυτό που συμβαίνει είναι ότι ο διερμηνευτής υπολογίζει την αριθμητική τιμήτης μεταβλητής $a η οποία είναι μηδέν και στη συνέχεια εκτελεί την πρό-σθεση Στην πραγματικότητα ο ∆ιερμηνευτής ελέγχει ένα-ένα τους χαρα-κτήρες (από αριστερά προς τα δεξιά) και σταματά στο πρώτο μη αριθμητικόψηφίο
my $a = ldquo11abcrdquomy $b = 123my $c = $a + $bprint $c
9Για όσους έχουν εμπειρία σε προγραμματισμό σε C δεδομένα τύπου char μπορεί κανείςεύκολα να θεωρήσει ότι είναι συμβολοσειρές μήκους 1
13
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
Σύμφωνα με τα προηγούμενα οι παραπάνω γραμμές τυπώνουν στο τερμα-τικό 134
Η χρήση του ενιαίου τύπου βαθμωτών δεδομένων προφανώς παρέχει μεγά-λες ευκολίες ιδίως στην εκτύπωση αναφορών από την άλλη πλευρά απαι-τεί κάποια επιπλέον προσοχή
Αριθμητικές τιμές
Μπορούμε να αποδόσουμε αριθμητικές τιμές σε βαθμωτές μεταβλητές μεοποιαδήποτε μορφή μας εξυπηρετεί Εσωτερικά η Perl τις αποθηκεύει μεμορφή αριθμών κινητής υποδιαστολής διπλής ακρίβειας (double-precisionfloating-point)
Κώδικας 110 Παραδείγματα Αριθμητικές τιμές σε βαθμωτές μεταβλητές$a = 134 a posit ive integer value$a = minus2004 a negative integer value$a = 5679 a posit ive f rac t iona l value$a = minus567913 a negative f rac t iona l value$a = 725e24 perl can understand the sc i en t i f i c notation$a = minus12Eminus29 also with negative significand andor exponent
Ιδιαίτερη προσοχή απαιτείται όταν επιχειρούμε να αποδόσουμε αριθμητικέςτιμές που ξεκινούν με το ψηφίο 0
$a=0377$b=5print $a+$brdquonrdquo
Το αποτέλεσμα που τυπώνεται είναι 260 Μπορείτε να το εξηγήσετε εάν θυ-μηθήτε ότι στο οκταδικό σύστημα ο αριθμός 377 αντιστοιχεί με το 255 στοδεκαδικό
141 Αλφαριθμητικές αλληλουχίες - Strings
Με τον όρο string αναφερόμαστε σε μια αλληλουχία χαρακτήρων (αλφαβητι-κοί αριθμητικοί ή ακόμη και ειδικοί μη εκτυπώσιμοι χαρακτήρες όπως πχn t r) Προφανώς ιδιότητα κάθε string αποτελεί το μήκος του το οποίο
14
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Βαθμωτές (Scalar) Μεταβλητές
ισούται με το πλήθος των χαρακτήρων που το απαρτίζουν Συνέπεια αυτούείναι ότι το μικρότερο σε μήκος string είναι το κενό rdquordquo Προς τα πάνω όριοδεν υπάρχει από την Perl και περιορίζεται πρακτικά μόνο από το ποσό τηςελεύθερης φυσικής μνήμης που το λειτουργικό σύστημα μπορεί να παραχω-ρήσει στο διερμηνευτή της γλώσσας
Εν γένει τιμές τύπου string πρέπει να περιβάλλονται στον κώδικα μέσα σεμονά ή διπλά εισαγωγικά (δείτε 142)
142 Χρήση εισαγωγικών και παρεμβολή μεταβλητών
Στα παραπάνω παραδείγματα χρησιμοποιήσαμε τα διπλά εισαγωγικά (rdquo rdquo|) για να ορίσουμε τιμές αλφαριθμητικών (οι οποίες καταχωρούνται πι-θανά ως τιμές σε βαθμωτές μεταβλητές) Στην πραγματικότητα η Perl χρησι-μοποιεί τρεις διαφορετικούς τύπους εισαγωγικών με τελείως διαφορετικέςδυνατότητες
1 Απλά εισαγωγικά (rsquorsquo) Οτιδήποτε βρίσκεται μεταξύ δύο διαδοχικώναπλών εισαγωγικών θεωρείται ως συμβολοσειρά χαρακτήρα προς χα-ρακτήρα
2 ∆ιπλά εισαγωγικά (rdquordquo) Έχουν τις ιδιότητες των απλών με τη διαφοράότι
bull Ανάμεσά τους επιτρέπονται οι γνωστοί χαρακτήρες διαφυγής- με-ταχαρακτήρες (n r t κλπ)
bull Αν τοποθετηθεί ανάμεσά τους το όνομα μιας μεταβλητής ο ∆ιερ-μηνευτής υπολογίζει την τιμή της την οποία και παρεμβάλει στοτελικό αλφαριθμητικό που προκύπτει
3 BackticksBackquotes (ʻ ʻ|) Εκτελούν εντολές του λειτουργικού συστή-ματος (Περισσότερες λεπτομέρειες στα επόμενα)
15
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
15 Διανυσματικά δεδομένα laquoΣύνολα Τιμώνraquo - Πίνακες (Arrays)-Λίστες (Lists)
Η Perl διαθέτει μεταβλητές τύπου Πίνακα-Λίστας10 οι οποίες είναι δυναμι-κές δομές δεδομένων (δεν απαιτείται εκ των προτέρων η δήλωση του μεγέ-θους τους) Μπορούμε να αυξάνουμεμειώνουμε το μέγεθος ενός πίνακα καινα εμπιστευόμαστε laquoμε κλειστά μάτιαraquo την Perl για την ορθή διαχείριση τηςμνήμης Τα ονόματα μεταβλητών τύπου πίνακα ξεκινούν υποχρεωτικά με τοχαρακτήρα Ο απλούστερος τρόπος για να δημιουργήσουμε ένα πίνακαείναι ο παρακάτω
my empty = () Array without elements
Ο πίνακας με όνομα empty δημιουργήθηκε χωρίς στοιχεία
my a = (123456)
ή
my a = ($a $b $c $my_name)
Όπως πρέπει να γίνεται προφανές τα στοιχεία ενός πίνακα είναι βαθμωτάδεδομένα Συνεπώς για να αποκτήσουμε πρόσβαση στα στοιχεία του πίνακαακολουθούμε το ακόλουθο πρότυπο
my a = (123456)print $a[0] Arrays start at position
zero (just like C-arrays)print $a[4] prints 5
Η Perl επιτρέπει να τοποθετούμε ως στοιχείο ενός πίνακα έναν άλλο πί-νακα Παρόλα αυτά τα στοιχεία του προϋπάρχοντος πίνακα ενσωματώ-νονται στον νέο πίνακα Για παράδειγμα οι γραμμές
my a = (123456)my b = (lsquoarsquo a 123)
είναι ισοδύναμες (ως προς τον πίνακα b) με την
my b = (lsquoarsquo123456123)
10Στην πραγματικότητα οι έννοιες πίνακας-λίστα δεν είναι ταυτόσημες στην Perl Σταπλαίσια όμως αυτής της εισαγωγής δε θα γίνει διάκριση και οι όροι θα χρησιμοποιούνταιχωρίς διάκριση
16
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Ευρετήρια (hashes)
151 Πίνακες Ουρές (queues) και Στοίβες (stacks)
Οι πίνακες της Perl με τη βοήθεια κατάλληλων συναρτήσεων που παρέχον-ται στην τυπική εγκατάσταση της γλώσσας υλοποιούν με μεγάλη ευκολίαπερισσότερο σύνθετες δομές δεδομένων όπως οι Ουρές και οι Στοίβες
my a = (123456)push (a 7) Bazei teleytaio stoixeiopop (a) Pairnei teleytaio stoixeioshift (a) Pairnei prwto stoixeiounshift (a -3) Bazei prwto stoixeio
Με χρήση των push shift υλοποιούμε ουρές ενώ με τη χρήση των push pop στοί-βες11
16 Ευρετήρια (hashes)
Για να γίνει κατανοητή η χρησιμότητα-χρηστικότητα μεταβλητών τύπου ευ-ρετηρίου 12 αρκεί να πούμε ότι τα ευρετήρια laquoεμφανισιακάraquo μοιάζουν μεπίνακες στα στοιχεία των οποίων έχουμε πρόσβαση με αλφαριθμητικό (καιόχι με αύξοντα αριθμό) Τα ονόματα μεταβλητών τύπου ευρετηρίου ξεκινούνυποχρεωτικά με το χαρακτήρα Τα ευρετήρια έχουν αλφαριθμητικές λέξεις-κλειδιά (κλειδιά keys) σε κάθε ένα από τα οποία αντιστοιχίζεται μια τιμή∆ηλαδή ένα ευρετήριο είναι ένα σύνολο από ζεύγη κλειδί-τιμή Ο ορισμόςενός απλού ευρετηρίου μπορεί να γίνει με τον παρακάτω απλό τρόπο
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
Για παράδειγμα το ευρετήριο bases έχει κλειδιά τις 4 βάσεις του DNA καιαντίστοιχες τιμές 1 ή 0 ανάλογα με το αν η συγκεκριμένη βάση ανήκει στις
11Συγκρίνετε την ευκολία που σας παρέχει η Perl για την υλοποίηση αυτών των δομώνδεδομένων σε σχέση με άλλες γλώσσες προγραμματισμού
12Συνώνυμα hash associative array και σε άλλες γλώσσες προγραμματισμού dictionary
17
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
πυριμιδίνες ή τις πουρίνες Στο παραπάνω ευρετήριο θα μπορούσαμε ναπροσθέσουμε στοιχεία
$baseslsquoYrsquo = 1$baseslsquoRrsquo = 0
ή να είχαμε πρόσβαση στην τιμή που αντιστοιχεί σε κάποιο κλειδί
print $baseslsquoArsquo ldquonrdquo
161 Η συνάρτηση keys
Η συνάρτηση keys δέχεται όρισμα ένα ευρετήριο και επιστρέφει μια λίστα μεστοιχεία τα κλειδιά του ευρετηρίου Για παράδειγμα
my k = keysbases
Σημειώνεται το γεγονός ότι η σειρά με την οποία επιστρέφονται τα κλειδιάτου ευρετηρίου δεν έχει σχέση ούτε με τη σειρά με την οποία τα αποθηκεύ-σαμε ούτε με την αλφαβητική σειρά13 Μπορούμε να πάρουμε τα κλειδιά μεαύξουσα λεξικογραφική σειρά με χρήση της συνάρτησης sort ή με φθίνουσασειρά με συνδυασμό της sort και της reverse14
my ksort = sort keysbasesmy krsort = reverse sort keysbases
∆οκιμάστε το συνδυασμό των sort και reverse με την αντίστροφη σειρά καισχολιάστε το αποτέλεσμα
17 Συμβάσεις συγγραφής κώδικα
18 Τελεστές
13Ας αφήσουμε κι αυτό να είναι ένα από τα μυστικά της Perl Στην πράξη κάθε αλφαριθμη-τικό κλειδί μετατρέπεται εσωτερικά σε ένα αριθμητικό με μια διαδικασία που στην επιστήμητης πληροφορικής ονομάζεται hashing Σας λέει τίποτε το όνομα λοιπόν
14Οι συναρτήσεις sort και reverse δέχονται ως ορίσματα και επιστρέφουν ως τιμές λίστεςΜαντέψτε τη λειτουργία τους η Perl σας το επιτρέπει
18
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Τελεστές
181 Εντολές σύνθετης καταχώρησης
Μια εντολή σύνθετης καταχώρησης πραγματοποιείται συνδυάζοντας ορι-σμένους από τους γνωστούς τελεστές (OP) με τον τελεστή απόδοσης τιμής(=) και έχουν τη γενική μορφή
μεταβλητή OP= παράσταση
η οποία ισοδυναμεί με την εντολή
μεταβλητή = μεταβλητή OP παράσταση
Οι ιδιότητες των σύνθετων τελεστών είναι αντίστοιχες με εκείνες των απλώναπό τους οποίους προέρχονται
Παραδείγματα Α Οι εντολές
$i += 1$i = $i+1
είναι ισοδύναμες
Β Έστω ότι
my $x=2 my $ y=3
τότε
Πίνακας 11 default
Εντολή Τιμή του $y$y+=$xminus1 4$yminus=$x$x -1
$y=$x 1
182 Λογικές προτάσεις - Τελεστές (λογικοί και σύγκρισης) - Συνθή-κες
Η Perl παρέχει πλήθος δομών ελέγχου και επανάληψης που στο σύνολό τουςδεν υποστηρίζονται από τις περισσότερες γλώσσες προγραμματισμού Κεν-τρικό ζήτημα στη χρήση των δομών αυτών οι οποίες αποτελούν σημαντικό
19
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
εργαλείο για τον καθορισμό της ροής ενός προγράμματος αποτελούν οι λο-γικές προτάσεις και η διαχείριση λογικών τιμών
Γενικά ως λογική πρόταση15 μπορούμε να θεωρήσουμε κάθε πρόταση ηοποία (όταν διατυπωθεί ως ερώτηση) μπορεί να λάβει δύο απαντήσεις (λο-γικές τιμές) ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ Η πρόταση rdquoΤώρα βρέχει στον κήποrdquo είναιμια λογική πρόταση γιατί αν βγούμε έξω στον κήπο16 μπορούμε να απο-φανθούμε αν είναι ΑΛΗΘΗΣ ή ΨΕΥ∆ΗΣ (είναι προφανές ότι δεν υπάρχει τρίτοενδεχόμενο) Με το ίδιο σκεπτικό η πρόταση rdquoΠοιό είναι το ύψος του Γιάννηrdquoδεν αποτελεί λογική πρόταση Πρακτικά η Perl δεν διαθέτει κάποιο ειδικότύπο μεταβλητής17 ο οποίος να διαχειρίζεται λογικές τιμές18 και ό χειρι-σμός τέτοιων προβλημάτων πραγματοποιείται με έμμεσο τρόπο Για την Perlη αριθμητική τιμή μηδέν (0) αναπαριστά την τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτεάλλη τιμή την τιμή ΑΛΗΘΗΣ Με βάση το γεγονός ότι οι αριθμητικές τιμέςαποθηκεύονται στον ίδιο τύπο δεδομένων με τις συμβολοσειρές (θυμηθείτεμεταβλητές βαθμωτού τύπου) οι συμβολοσειρές rdquordquo (κενή συμβολοσειρά) καιrdquo0rdquo (το ψηφίο μηδέν) αντιστοιχούν σε τιμή ΨΕΥ∆ΗΣ ενώ οποιαδήποτε άλλητιμή στην τιμή ΑΛΗΘΗΣ
Η Perl παρέχει τους τρεις βασικούς λογικούς τελεστές19 (12) οι οποίοι υλο-ποιούν τις βασικές λογικές πράξεις Με τη χρήση τους και τον κατάλληλοσυνδυασμό λογικών προτάσεων υλοποιούνται και οι πιο σύνθετες λογικέςπροτάσεις Η σύζευξη δυο προτάσεων (λογικό ΚΑΙ AND) είναι ΑΛΗΘΗΣ μόνοόταν και οι δύο είναι αληθείς ενώ η διάζευξή τους είναι ΑΛΗΘΗΣ όταν κά-ποια από τις δύο είναι ΑΛΗΘΗΣ Η άρνηση μιας πρότασης (λογικό OXΙ NOT)είναι ΨΕΥ∆ΗΣ αν η πρόταση είναι ΑΛΗΘΗΣ και ΑΛΗΘΗΣ στην αντίθετη πε-ρίπτωση Προφανώς ο τελεστής άρνησης είναι μοναδιαίος δηλαδή δέχεταιως όρισμα μία μόνο λογική πρόταση
Σημειώνεται ότι υποστηρίζονται οι σύνθετοι δυαδικοί λογικοί τελεστές ανά-θεσης ampamp= και ||= με προφανή σημασία
Για την Perl ως λογική πρόταση μπορεί να θεωρηθεί οποιαδήποτε σύγκριση15Θα χρησιμοποιείται ο όρος πρόταση όταν αυτό δεν προκαλεί σύγχυση16Ή και με πολλούς εναλλακτικούς τρόπουςαφού στην Perl TMTOWTDI17Τέτοιοι τύποι μεταβλητών υποστηρίζονται από άλλες γλώσσες προγραμματισμού και
συνήθως ονομάζονται μεταβλητές Boolean τύπου όνομα που προέρχεται από την άλγεβραBoole η οποία με κομψό και αποδοτικό τρόπο χειρίζεται τις τιμές λογικών προτάσεων
18Οι λογικές τιμές ονομάζονται και τιμές αληθείας19Αν και αυτό δεν είναι η πλήρης αλήθεια όπως θα δείτε στη συνέχεια
20
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Τελεστές
Πίνακας 12 Οι λογικοί τελεστές της Perl και οι πίνακες αληθείας τους
AND OR NOT(Σύζευξη) (∆ιάζευξη) (Άρνηση)
x y x ampamp y x || y x0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0
ή μεταβλητή20 Οι τελεστές σύγκρισης (relational operators) που μπορούν ναδράσουν σε βαθμωτά δεδομένα πρέπει να διαχωριστούν σε δύο κατηγορίεςαφού οι βαθμωτές μεταβλητές μπορούν να διαχειριστούν τόσο αριθμητι-κές όσο και αλφαριθμητικές τιμές21 Η σύγκριση συμβολοσειρών πραγματο-ποιείται με τη λεγόμενη ʼλεξικογραφική σειράʼ τη σειρά εκείνη με την οποίακαταχωρούνται τα λήμματα ενός λεξικού Οι διαθέσιμοι τελεστές περιγρά-φονται στον επόμενο πίνακα (13) Τα παραδείγματα που ακολουθούν αξίζεινα μελετηθούν με πολύ προσοχή22 διότι παρουσιάζουν σε ορισμένες περι-πτώσεις χρήσεις των τελεστών οι οποίες είναι καθʼ όλα νόμιμες και σύμ-φωνες με το συντακτικό της Perl αλλά δίνουν (μη αναμενόμενα) αποτελέ-σματα
20Ή απλά η τιμή που επιστρέφεται από κάποια διαδικασία21Αυτό πρέπει ήδη να έχει γίνει πολύ σαφές μετά από τόσες επαναλήψεις ώστε να μην
απαιτείται η αναφορά του στο μέλλον22Προτείνεται να δοκιμάσετε να τρέξετε τον κώδικα που σας δίνετε και να δοκιμάσετε διά-
φορες παραλλαγές
21
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
Πίν
ακας
13
Τελε
στές
σύγ
κρισ
ης
Τελε
στής
Ορί
σματ
αΕπ
ιστρ
έφει
23
ltΑρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
ικρό
τερη
αρι
θμητ
ική
τιμή
απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μεγ
αλύτ
ερη
αριθ
μητι
κή τ
ιμή
από
το ∆
Οlt
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
μικ
ρότε
ρη ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
gt=
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει μ
εγαλ
ύτερ
η ή
ίση
αριθ
μητι
κή τ
ιμή
με τ
ο ∆Ο
ltΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μικρ
ότερ
η απ
ό το
∆Ο
gtΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή με
γαλύ
τερη
απ
ό το
∆Ο
leΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή μι
κρότ
ερη
ή ίσ
η με
το
∆Οge
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
μεγα
λύτε
ρη ή
ίση
με τ
ο ∆Ο
==
24Αρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει α
ριθμ
ητικ
ή τι
μή ίσ
η με
το
∆Ο25
=ΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
αρι
θμητ
ική
τιμή
δια
φορ
ετικ
ή απ
ό το
∆Ο
lt=
gt-1
0 ή
1 ε
άν η
αρι
θμητ
ική
τιμή
του
ΑΟ
είνα
ι μικ
ρότε
ρη ί
ση ή
μεγ
αλύτ
ερη
από
αυτή
του
∆Ο
αντ
ίστο
ιχα
eqΑλ
φαρ
ιθμη
τικά
ΑΛΗ
ΘΕΣ
αν
το Α
Οέχ
ει (λ
εξικ
ογρα
φικ
ά) τ
ιμή
ίση
με τ
ο ∆Ο
neΑΛ
ΗΘ
ΕΣ α
ν το
ΑΟ
έχει
(λεξ
ικογ
ραφ
ικά)
τιμ
ή δι
αφορ
ετικ
ή απ
ό το
∆Ο
cmp
-1 0
ή 1
εάν
η (λ
εξικ
ογρα
φικ
ή) τ
ιμή
του
ΑΟεί
ναι μ
ικρό
τερη
ίση
ή μ
εγα-
λύτε
ρη α
πό
αυτή
του
∆Ο
αντ
ίστο
ιχα
23
ΑΟ Α
ριστ
ερό
Όρι
σμα
∆Ο
∆εξ
ί Όρι
σμα
24
Στην
ορο
λογί
α τη
ς Pe
rl οι
τελ
εστέ
ς =
=
= lt
=gt
eq
ne
cm
p δ
ιαχω
ρίζο
νται
απ
ό το
υς τ
ελεσ
τές
σύγκ
ριση
ς κα
ι ονο
μάζο
νται
τελ
εστέ
ς ελ
έγχο
υ ισ
ότητ
ας (E
qual
ity O
pera
tors
) αλλ
ά δε
θα
ακολ
ουθή
σουμ
εαυ
τή τ
η δι
άκρι
ση
25
Προ
σοχή
Προ
κειμ
ένου
για
πρα
γματ
ικού
ς αρ
ιθμο
ύς κ
ινητ
ής υ
ποδ
ιαστ
ολής
είν
αι δ
υνατ
όν ν
α υπ
άρχε
ιαπ
ρόβλ
επτη
συμ
περ
ιφορ
ά λό
γω σ
φαλ
μάτω
ν ακ
ρίβε
ιας
22
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Τελεστές
Παράδειγμα 1 Η λογική πρόταση 1lt5 είναι προφανώς ΑΛΗΘΗΣ επομένωςεάν δώσουμε την εντολή
userajax~gtperl ndashe lsquoprint 1lt5 ldquonrdquorsquo
στο τερματικό εμφανίζεται 1 (ΑΛΗΘΗΣ)
Παράδειγμα 2 Ο κώδικας
my $a = ldquo123rdquomy $b = 235my $c = ($a lt=gt $b)print $c
τυπώνει στο τερματικό minus1 (δοκιμάστε αλλάζοντας τιμές στις αναθέσεις με-ταβλητών ή παραλείποντας τις παρενθέσεις26)
Παράδειγμα 3 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a eq $b)print $c
τυπώνει στο τερματικό την κενή συμβολοσειρά (rdquordquo) Προφανώς οι συμβολο-σειρές rdquoLakisrdquo και rdquoLAKISrdquo δεν είναι ίσες27
Παράδειγμα 4 Ο κώδικας
my $a = ldquoLakisrdquomy $b = ldquoLAKISrdquomy $c = ($a == $b)print $c
τυπώνει στο τερματικό 1 (ΑΛΗΘΕΣ) Προφανώς οι συμβολοσειρές rdquoLakisrdquo καιrdquoLAKISrdquo δεν είναι ίσες (βλέπετε παράδειγμα 3) αλλά η σύγκριση που επιχει-ρείται να πραγματοποιηθεί είναι αριθμητική Οι βαθμωτές μεταβλητές $a $b
26Σχετικά με την προτεραιότητα με την οποία εκτελεί η Perl τους διάφορους τελεστές νασυμβουλευτείτε το σχετικό εγχειρίδιο (userazax~gtperldoc perlop)
27Αρκεί να θυμηθείτε ότι οι πεζοί και οι κεφαλαίοι χαρακτήρες έχουν διαφορετική ASCIIαναπαράσταση
23
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
έχουν και οι δύο αριθμητική τιμή ίση με μηδέν (0) επομένως δικαιολογείταιτο αποτέλεσμα της σύγκρισής τους
ΠροσοχήΜπορείτε να κατανοήσετε πλέον ότι η ελευθερία μπορεί να είναι πολύ σπουδαίοαγαθό αλλά πρέπει να χρησιμοποιείται με προσοχή Η Perl δεν ξεφεύγει από αυτόντον κανόνα
Παράδειγμα 5 Ο κώδικας
my $a = 123my $b = 124my $c = 24my $d = ($a lt $b)print $d ldquonrdquomy $e = ($c lt $b) print $e ldquonrdquo
τυπώνει στο τερματικό (με αλλαγή γραμμής) 1 (ΑΛΗΘΕΣ) και την κενή συμ-βολοσειρά Στο παράδειγμα αυτό οι βαθμωτές μεταβλητές $a $b $c συγκρί-νονται λεξικογραφικά
19 Δομές ελέγχου και επανάληψης
191 Επαναληπτική πρόσβαση στα στοιχεία Πινάκων και Ευρετηρίων -Η δομή foreach
Ένας απλός τρόπος για να έχουμε πρόσβαση στο σύνολο των στοιχείωνενός πίνακα και κατʼ επέκταση ενός ευρετηρίου (με τη χρήση της συνάρτησηςkeys) παρέχεται με τη δομή επανάληψης foreach Το παρακάτω παράδειγμα δεχρειάζεται πολλές επεξηγήσεις
my names = (lsquotakisrsquo lsquolakisrsquo lsquonikosrsquo)foreach my $name (names)print $name ldquonrdquo
και τυπώνει στο τερματικό
24
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Ομαδοποίηση δηλώσεων και εντολών - blocks
takislakisnikos
δηλαδή τα στοιχεία του πίνακα με τη σειρά με την οποία είναι καταχωρη-μένα
Αντίστοιχα για ευρετήρια με τη χρήση των συναρτήσεων keys sort
my bases = (lsquoArsquo 0lsquoTrsquo 1lsquoCrsquo 1lsquoGrsquo 0
)
foreach my $b (sort keys bases)print $bases$b ldquonrdquo
Σημείωση Παρατηρήστε τι θα συνέβαινε εάν δεν είχατε χρησιμοποιήσει τησυνάρτηση sort
110 Ομαδοποίηση δηλώσεων και εντολών - blocks
Ο ∆ιερμηνευτής της Perl διαβάζει το αρχείο του πηγαίου κώδικα από τηναρχή προς το τέλος γραμμή-γραμμή και θεωρεί ότι κάποιο κείμενο αποτελείμια ολοκληρωμένη δήλωση ή εντολή μόλις συναντήσει το χαρακτήρα Αυτόμας επιτρέπει28 να τοποθετούμε περισσότερες από μία εντολές στην ίδιαγραμμή ή εναλλακτικά να δίνεται μια και μόνο εντολή σε περισσότερες τηςμίας γραμμής Για παράδειγμα όπως μπορείτε εύκολα να διαπιστώσετε οκώδικας
my $a = 5 my $b = 7 print $a lsquo rsquo $b ldquonrdquo
έχει το ίδιο αποτέλεσμα με τον28Αν και δεν πρέπει να γίνεται κατάχρηση αυτής της δυνατότητας εφόσον επιθυμούμε να
συγγράφουμε ευανάγνωστα προγράμματα και επειδή υπάρχουν εξαιρέσεις (όπως σε όλουςάλλωστε τους κανόνες)
25
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
my $a = 5my $b = 7print $a lsquo rsquo $b ldquonrdquo
καθώς και με τον
my $a=5my $b = 7print $alsquo rsquo $b ldquonrdquo
Σημείωση Η δεύτερη μορφή κατά γενική ομολογία είναι η περισσότερο ευα-νάγνωστη29
Η Perl ομαδοποιεί τμήματα του κώδικα σε blocks τα οποία ορίζονται ανά-μεσα σε άγκιστρα Οι μεταβλητές που ορίζονται σε ένα block30 αποκτούνκατευθείαν τοπική εμβέλεια στο συγκεκριμένο block Για παράδειγμα όπωςμπορείτε εύκολα να διαπιστώσετε ο κώδικας
Κώδικας 111 usrbinperl ndashwuse s t r i c t my $a = 1my $a = 2print $a ldquordquon
pr int $a ldquordquon
τυπώνει στο τερματικό
21
Παρατηρήστε ότι η τελευταία δήλωση του παραπάνω block δεν τερματίζε-ται με το χαρακτήρα Αυτός ο ʻιδιωματισμόςʼ αν και επιτρέπεται από τη
29Παρόλο που μπορεί κάποιος να διαφωνήσει με αυτό για καθαρά υποκειμενικούς λόγους
30Θεωρώ ότι πλέον έχουμε ξεκαθαρίσει το γεγονός ότι όλες οι μεταβλητές δηλώνονται πριντη χρήση τους με my
26
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Έλεγχος και επανάληψη
γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της Perl βα-σίζεται πολύ στην έννοια των blocks και απαιτείται μεγάλη προσοχή όσοναφορά την ορατότητα - εμβέλεια των μεταβλητών που χρησιμοποιούμε σταπρογράμματά μας
111 Έλεγχος και επανάληψη
Η χρησιμότητα των blocks γίνεται άμεσα αντιληπτή στην περίπτωση πουεπιθυμούμε να χρησιμοποιήσουμε δομές ελέγχου ή επανάληψης τη σύνταξητων οποίων θα δούμε παρακάτω
1111 if elsif else
Η γενική μορφή της είναι
if (συνθήκη0)
elsif (συνθήκη1)
elsif (συνθήκη2)
elsif (συνθήκηΝ)
else
27
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
Μια τέτοια δομή έχει μπορεί να έχει καμία ή περισσότερες διακλαδώσεις elsif και το πολύ μία else ανάλογα με τις διαφορετικές περιπτώσεις που θέλουμενα εξετάσουμε
Παράδειγμα Να γραφεί δομή if elsif else με την οποία να ελέγχεται αν μιαβαθμωτή μεταβλητή ($base) έχει τιμή που αντιστοιχεί σε μια από τις βάσειςτου DNA και να τυπώνεται το όνομά της σε μια νέα γραμμή ή μήνυμα σφάλ-ματος στην αντίθετη περίπτωση
Σημείωση Παρατηρήστε τη χρήση λογικών τελεστών για το σύνθετο έλεγχοπου επιτρέπει οι βάσεις να δίνονται είτε με πεζούς είτε με κεφαλαίους χα-ρακτήρες
if ($base eq lsquoArsquo || $base eq lsquoarsquo )print ldquonAdeninerdquo
elsif ($base eq lsquoTrsquo || $base eq lsquotrsquo)print ldquonThyminerdquo
elsif ($base eq lsquoCrsquo || $base eq lsquocrsquo)
print ldquonCytosinerdquoelsif ($base eq lsquoGrsquo || $base eq lsquogrsquo)
print ldquonGuaninerdquoelseprint ldquo$base does not stand for a nucleotidenrdquo
1112 unless
Έχει αντίστοιχη χρήση με ένα απλό έλεγχο με if Απλά όπως και το όνομαδηλώνει η συνθήκη πρέπει να είναι ΨΕΥ∆ΗΣ Ελέγξτε τα αποτελέσματα του
28
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Έλεγχος και επανάληψη
κώδικα
Κώδικας 112 my $a=1foreach my $b (0 10)
i f ( $a lt $b )pr int ldquoInside i f blockrdquon
unless ($a gt= $b)pr int ldquoInside unless blockrdquon
1113 for
Υλοποιεί τον κλασικό βρόχο επανάληψης υπό συνθήκη Η βασική του μορφήείναι
for (αρχικοποίηση συνθήκη μεταβολή)εντολές και δηλώσεις
Παράδειγμα Ελέγξτε την έξοδο του ακόλουθου προγράμματος
Κώδικας 113 usrbinperl ndashwuse s t r i c t my $a = 5for (my $a=10 $agt0 $a minus= 05)pr int $a ldquordquon
pr int $a ldquordquon
29
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
1114 while
Επανάληψη υπό συνθήκη Για κάθε βρόχο for μπορεί εν γένει να γραφεί έναςαντίστοιχος βρόχος while Η βασική του μορφή είναι
while ( συνθήκη )εντολές και δηλώσεις
Παράδειγμα Ο βρόχος for του προηγούμενου προγράμματος γραμμένος μεwhile
Κώδικας 114 usrbinperl ndashwuse s t r i c t my $a = 5while ( $agt0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη διαφορά
1115 until
Χρησιμοποιείται αντίστοιχα με το βρόχο while με τη διαφορά ότι η εκτέ-λεση του αντίστοιχου block εντολών πραγματοποιείται όσο η συνθήκη είναιΨΕΥ∆ΗΣ
Παράδειγμα Ο βρόχος while του προηγούμενου προγράμματος γραμμένοςμε until
Κώδικας 115 usrbinperl ndashw
30
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Έλεγχος και επανάληψη
use s t r i c t my $a = 5unt i l ( $alt=0 )pr int $a ldquordquon $a minus= 05
pr int $a ldquordquon
Να παρατηρήσετε τη συνθήκη ελέγχου
1116 do whileuntil
Με το πρόθεμα της εντολής do δημιουργούνται παραλλαγές των βρόχων while
και until Βασική διαφορά αυτών των βρόχων είναι ότι το block εντολών εκτε-λείται οπωσδήποτε μία φορά πριν οποιοδήποτε έλεγχο της συνθήκης Η γε-νική μορφή της είναι
doεντολές και δηλώσεις
while ( συνθήκη )
ή
doεντολές και δηλώσεις
until ( συνθήκη )
1117 Ιδιωματισμοί και παραλειπόμενα στις δομές ελέγχου και επανά-ληψης
Οι δομές ελέγχου και επανάληψης (ας μην ξεχνάμε τη foreach που αναφέρ-θηκε νωρίτερα) πέρα από τον γενικό τρόπο χρήσης τους με τον οποίο πα-ρουσιάστηκαν συντάσσονται και με πιο ελεύθερο τρόπο σύμφωνα με τηννοοτροπία που ακολουθείται στην Perl
Για παράδειγμα σε αναλογία με τη φυσική γλώσσα η δήλωση
31
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
print $a ldquordquon if $a gt 5
είναι ισοδύναμη με
if( $a gt 5 )print $a ldquonrdquo
Αυτή η δυνατότητα προσφέρει υψηλότερη αναγνωσιμότητα στον κώδικα σεσημεία τα οποία μας ενδιαφέρει περισσότερο να βλέπουμε τις ενέργειες οιοποίες εκτελούνται από το πρόγραμμα και λιγότερο οι λογικές προτάσεις οιοποίες ρυθμίζουν τη ροή του προγράμματος Μπορείτε να δοκιμάσετε τηναντίστοιχη σύνταξη με τις unless while until
Η σειριακή εκτέλεση των block εντολών επαναληπτικών βρόχων (εκτός απόdo whileuntil ) μπορεί να τροποποιηθεί με τη χρήση ειδικών εντολών
bull next παραλείπονται όλες οι επόμενες εντολές του block
bull last εγκαταλείπεται πλήρως το block
bull redo εκτελείται ξανά η τελευταία επανάληψη χωρίς να ελεγχθεί η αντί-στοιχη συνθήκη
Παραδείγματα Μελετήστε την έξοδο του ακόλουθου κώδικα
Κώδικας 116 usrbinperl ndashwuse s t r i c t my $a = 5print ldquoBefore f i r s t blockrdquon while ( $agt0 )pr int $a ldquordquon $a minus= 05las t i f $a == 2
pr int $a ldquordquon
my $b = 5print ldquoBefore second blockrdquon while ( $bgt0 )
32
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Υποπρογράμματα - Subroutines
next i f $b == 2redo i f $b == 3print $b ldquordquon $b minus= 05
pr int $b ldquordquon
112 Υποπρογράμματα - Subroutines
Τα υποπρογράμματα31 μπορεί κανείς να τα θεωρήσει ως ανεξάρτητα τμή-ματα κώδικα (blocks) τα οποία έχουμε τη δυνατότητα να τα καλούμε συ-νήθως32 με βάση ένα όνομα που τους έχουμε δώσει και πραγματοποιούνμια συγκεκριμένη λειτουργία Τα υποπρογράμματα ορίζονται στην Perl μετη λέξη-κλειδί sub και το όνομα του υποπρογράμματος στη συνέχεια
Η γενική μορφή που έχουν οι δηλώσεις τους είναι
sub useless2
Η συνάρτηση που μόλις ορίστηκε έχει το περιγραφικό () όνομα useless τοοποίο αντικατοπτρίζει πλήρως τη λειτουργία της (δεν κάνει απολύτως τί-ποτα33)
Η κλήση ενός υποπρογράμματος μπορεί να πραγματοποιηθεί είτε μέσα απότον κυρίως κορμό του προγράμματός μας είτε από οποιοδήποτε υποπρό-γραμμα (ακόμα και από τον εαυτό του34) Γενικά η κλήση μιας συνάρτησης
31Στα οποία συχνά θα αναφερόμαστε και με τον όρο συναρτήσεις Στη βιβλιογραφία γί-νεται συχνά διάκριση των υποπρογραμμάτων σε διαδικασίες (procedures) και συναρτήσεις(functions) ανάλογα με το αν επιστρέφεται κάποια τιμή στο καλών υποπρόγραμμα Με βάσηκαι τις συζητήσεις στο μάθημα έχει κάτι τέτοιο νόημα στην Perl
32Υπάρχουν και ανώνυμα υποπρογράμματα τα οποία θα εξετάσουμε όταν μάθουμε για τιςαναφορές σε μεταβλητές
33Σίγουρα (∆είτε τις σχετικές εργασίες )34∆είτε τις σχετικές εργασίες
33
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
στην Perl μπορεί να πραγματοποιηθεί με διάφορους τρόπους οι συνηθέστε-ροι από τους οποίους είναι
uselessampuselessuseless() klisi me lista orismatwnampuseless() klisi me lista orismatwn
Προφανώς στην περίπτωση της συνάρτησης useless η λίστα ορισμάτων δενέχει κάποιο ιδιαίτερο νόημα Θα είχε νόημα όμως αν θέλαμε να δημιουρ-γήσουμε μια συνάρτηση η οποία να δέχεται δύο βαθμωτές τιμές και να επι-στρέφει το άθροισμά τους Τα ορίσματα μπορεί να είναι μεταβλητές (ή τιμές)οι οποίες αναγράφονται σε μια λίστα μετά το όνομα της συνάρτησης πουκαλείται Αυτά τα δεδομένα γίνονται διαθέσιμα στην καλούμενη συνάρτησημέσω του (τοπικής εμβέλειας) πίνακα _
Επομένως ο επόμενος κώδικας
Κώδικας 117 usrbinperl ndashwuse s t r i c t pr int ( ampadd(2 3) ) sub addmy $f i r s t = $_ [ 0 ] my $second = $_ [ 1 ] return $ f i r s t + $second
είναι προφανές ότι τυπώνει στο τερματικό την τιμή 5 Προφανώς αφού ημεταβλητή _ είναι τύπου array επιτρέπεται να έχουμε πρόσβαση στα στοι-χεία του με όλους τους εναλλακτικούς τρόπους που γνωρίζουμε
Για τις συναρτήσεις της Perl (αντίθετα με ότι συμβαίνει στη C) δεν απαιτείταιη δημιουργία πρωτοτύπων ούτε είναι απαραίτητο να δηλώνεται ο τύποςδεδομένων τα οποία επιστρέφουν στην καλούσα συνάρτηση
34
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Επέστρεψε βγες και πέθανε (return exit die)
1121 Ειδικά υποπρογράμματα
Υπάρχουν τέσσερα υποπρογράμματα με προκαθορισμένα ονόματα και συγ-κεκριμένη συμπεριφορά ο κώδικας των οποίων μπορεί να οριστεί στον πη-γαίο κώδικα
BEGIN Εκτελείται μόλις τη συναντήσει ο ∆ιερμηνευτής πριν καν μεταγλωτ-τίσει τον υπόλοιπο κώδικα
CHECK Εκτελείται μόλις τελειώσει η μεταγλώττιση του κώδικα αλλά πριναρχίσει η εκτέλεση του προγράμματος
INIT Εκτελείται ακριβώς πριν ξεκινήσει η κύρια ροή του προγράμματος
END Εκτελείται ακριβώς μετά το πέρας της εκτέλεσης του προγράμματος
Αυτά τα υποπρογράμματα δεν καλούνται ρητά ούτε απαιτούν τη χρήση τουsub κατά τον ορισμό τους Στο block του κώδικά τους πρόσβαση (άμεση ήέμμεση) στον πίνακα _ αντιστοιχούν σε πρόσβαση στον πίνακα ορισμάτωνARGV Σημειωτέον ότι στο ίδιο αρχείο πηγαίου κώδικα μπορούν να οριστούνπολλαπλές φορές χωρίς ο ένας ορισμός να αναιρεί τον άλλο ΠολλαπλέςBEGIN INIT εκτελούνται με τη σειρά με την οποία έχουν δηλωθεί στον πηγαίοκώδικα ενώ πολλαπλές CHECK και END με αντίστροφη σειρά
113 Επέστρεψε βγες και πέθανε (return exit die)
Ο σουρεαλιστικός τίτλος της ενότητας αποδίδει τους όρους για τρία βασικάεργαλεία του ελέγχου της ροής προγραμμάτων σε γλώσσα Perl return exit καιdie Η δήλωση
return παράσταση
σε ένα block υποπρογράμματος επιστρέφει την τιμή της παράστασης κα-θώς και τον έλεγχο της ροής του προγράμματος στην καλούσα συνάρτηση35Ο υπολογισμός της παράστασης είναι δυνατόν να επιστρέφει αποτέλεσμαείτε βαθμωτού τύπου είτε λίστας Η απουσία μιας τέτοιας δήλωσης οδηγεί
35Η return χρησιμοποιείται και σε blocks συναρτήσεων eval ή do FILE με αντίστοιχη λειτουρ-γικότητα
35
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
στην επιστροφή της τιμής της τελευταίας παράστασης που υπολογίστηκεστο block εντολών Η δήλωση
exit παράσταση
υπολογίζει την τιμή της παράστασης και τερματίζει τη λειτουργία του προ-γράμματος επιστρέφοντας την τιμή αυτή (συνήθως στο λειτουργικό σύ-στημα) Οι τιμές που αναγνωρίζονται γενικά είναι η τιμή 0 (επιτυχής τερ-ματισμός) και 1 (ανεπιτυχής τερματισμός) Στην πραγματικότητα η exit δεντερματίζει άμεσα την εκτέλεση του προγράμματος αφού εκτελούνται πρώταόσα υποπρογράμματα END έχουν τυχόν ορισθεί
Αντίστοιχα η δήλωση
die λίστα
τυπώνει36 την τιμή της λίστας στο προκαθορισμένο κανάλι εξόδου (STDERR)και εκτελεί την exit με τιμή εξόδου η οποία αντιστοιχεί στην τρέχουσα τιμήτης ειδικής μεταβλητής $ στην οποία η Perl αποθηκεύει ένα κωδικό σφάλ-ματος
Σημείωση Στην περίπτωση που το τελευταίο στοιχείο της λίστας δεν τε-λειώνει με χαρακτήρα αλλαγής γραμμής τυπώνονται οι αύξοντες αριθμοίγραμμής του αρχείου του πηγαίου κώδικα καθώς και του τρέχοντος αρχείουεισόδου37
114 Οδηγίες για τη συγγραφή ανεξάρτητων ενοτήτων λογισμι-κού (modules) με την Perl
Στην ενότητα αυτή θα δοθεί ένα προκαταρκτικό παράδειγμα για τον τρόπομε τον οποίο μπορείτε να πραγματοποιήσετε τη συγγραφή των προσωπι-κών σας modules με την Perl χωρίς να μπούμε σε πολλές τεχνικές λεπτομέ-ρειες38
36Στην πραγματικότητα αυτό δεν ισχύει για την περίπτωση της eval37Για το τι ακριβώς σημαίνει αριθμός γραμμής στο αρχείο εισόδου να επανέλθετε στη συγ-
κεκριμένη παράγραφο μόλις μιλήσουμε για είσοδο δεδομένων από αρχεία και τις ειδικές με-ταβλητές $ και $
38Λεπτομέρειες παρέχονται από τα εγχειρίδια perlmod και perlmodlib της Perl (εκτελών-τας για παράδειγμα από τη γραμμή εντολών userazax~gtperldoc perlmod) και τη σχετικήβιβλιογραφία
36
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Διαδικασίες εισόδου-εξόδου (ΙΟ)
Ως παράδειγμα θα δημιουργηθεί το αρχείο mylibpm στο οποίο θα υλοποιή-σουμε τις συναρτήσεις με ονόματα athroisma diafora ginomeno piliko και προ-φανείς λειτουργίες Στο αρχείο tst pl θα υλοποιηθεί ένα πρόγραμμα το οποίοδέχεται είσοδο από το πληκτρολόγιο και θα καλεί τις συναρτήσεις της βι-βλιοθήκης ανάλογα με την αλληλεπίδραση που θα έχει με το χρήστη Στασχόλια των προγραμμάτων θα περιγράφονται νέα χαρακτηριστικά της Perlτα οποία θα χρησιμοποιούμε από εδώ και στο εξής
Τα σχόλια του κώδικα στα αρχεία mylibpm και tst pl θα πρέπει να τα με-λετήσετε και να δοκιμάσετε τις προτεινόμενες αλλαγές για να κατανοήσετεδιάφορα χαρακτηριστικά της Perl
115 Διαδικασίες εισόδου-εξόδου (ΙΟ)
Τα προγράμματα εκείνα στα οποία οι τιμές όλων των παραμέτρων είναιʻhard-codedʼ στο πηγαίο αρχείο σπάνια μπορεί να αποκτήσουν γενική χρη-σιμότητα και διακρίνονται από έλλειψη ευελιξίας 39 Είναι καλή προγραμ-ματιστική πρακτική να μπορούμε να επηρρεάζουμε με εύκολο τρόπο τα δε-δομένα εισόδου στα οποία δρα και επεξεργάζεται ένα πρόγραμμά μας έτσιώστε όταν τα δεδομένα αυτά αλάζουν να μην απαιτείται να αλλάξουμε τοπρόγραμμά μας αλλά τον τρόπο με τον οποίο το καλούμε μόνο
Η Perl παρέχει δύο μηχανισμούς για να εισάγουμε πληροφορίες στα προ-γράμματά μας Στην απλούστερη περίπτωση μπορούμε να περάσουμε πα-ραμέτρους και ορίσματα στο πρόγραμμά μας από τη γραμμή εντολών ενώπιο προχωρημένη περίπτωση είναι αυτή κατά την οποία μπορούμε να χρη-σιμοποιήσουμε αρχεία στο δίσκο για ανάγνωση δεδομένων
Αντίστοιχα η έξοδος μπορεί να πραγματοποιείται στην προκαθορισμένηέξοδο ή σε κάποιο αρχείο που ορίζουμε
Είναι συχνό φαινόμενο να συνδυάζουμε κάποιους από τους παραπάνω μη-χανισμούς ΙΟ ανάλογα μα την περίπτωση και το αποτέλεσμα που επιθυ-μούμε
39Φανταστείτε να έπρεπε να εκτελέσετε το ίδιο πρόγραμμα για 1000 παραλλαγές της ίδιαςαλληλουχίας με ένα πολυμορφισμό κάθε φορά
37
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
1151 Παράμετροι προγραμμάτων από τη γραμμή εντολών
Παράμετροι είναι δυνατόν να περάσουν από τη γραμμή εντολών στα προ-γράμματά μας με τρόπο αντίστοιχο με αυτό που χρησιμοποιούμε για ναπεράσουμε ορίσματα σε υπορουτίνες
Για παράδειγμα εάν από τη γραμμή εντολών καλέσουμε το πρόγραμμα
userajax~gt myscriptpl arg1 arg2 arg3
στην πραγματικότητα πληροφορούμε τον διερμηνευτή να περάσει σε αυτότις παραμέτρους arg1 arg2 arg3
Στον κώδικα του προγράμματός μας απαιτείται να ενσωματώσουμε εξειδι-κευμένο τμήμα του κώδικα προκειμένου να αποκτήσουμε πρόσβαση στις τι-μές των παραμέτρων αυτών Ευτυχώς η Perl αναλαμβάει τη ldquoβρώμικηrdquo δου-λειά δημιουργώντας μια ειδική μεταβλητή τύπου array με το όνομα ARGV
(σας θυμίζει κάτι από C) Ο πίνακας ARGV περιέχει τις τιμές των παραμέ-τρων με τη σειρά που τις εισάγαμε στη γραμμή εντολών από αριστερά προςτα δεξιά
1152 Χρήση αρχείων
Filehandles - η συνάρτηση open()
Η είσοδος-έξοδος μεγάλου όγκου δεδομένων από τα προγράμματά μας απαι-τεί ιδιαίτερη μνεία Τα περισσότερα προγράμματα απαιτούν ορισμένα δε-δομένα στην είσοδό τους ενώ είναι απαραίτητο να μας δίνουν τα αποτελέ-σματά τους στην έξοδο
Σημαντικός μηχανισμός εξόδου της Perl που ήδη έχουμε εξετάσει είναι η εν-σωματωμένη συνάρτηση print η print δέχεται ως όρισμα ένα string το οποίοτυπώνει στο τερματικό Ας δούμε όμως σε λίγο περισσότερο βάθος μερικέςχρήσιμες λεπτομέρειες
Στην πραγματικότητα όλες οι διαδικασίες ΙΟ πραγματοποιούνται μέσωμιας εξειδικευμένης δομής δεδομένων που ονομάζεται filehandle Στην πράξηένα filehandle είναι ένα λογικό όνομα το οποίο έχει αντιστοιχηθεί σε ένα συγ-
38
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Διαδικασίες εισόδου-εξόδου (ΙΟ)
κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής open() με τη γενική σύν-ταξη
open(filehandle rdquo[mode]filenamerdquo)
To filehandle είναι ένα αλφαριθμητικό όνομα (χωρίς εισαγωγικά) που ορίζε-ται από το χρήστη 40 Παρότι αυτό δεν είναι απαραίτητο συνηθίζεται ναγράφονται με κεφαλαίους χαρακτήρες ώστε να ξεχωρίζουν από τον υπό-λοιπο κώδικα Το filename όπως είναι εύκολα κατανοητό είναι το όνομα τουαρχείου το οποίο θέλουμε να ldquoανοίξουμεrdquo με την κλήση της open 41 Μπρο-στά από το όνομα αρχείου τοποθετούμε (προαιρετικά όπως θα δείτε) έναειδικό χαρακτήρα ο οποίος υποδηλώνει το λόγο για τον οποίο επιθυμούμενα ανοίξουμε το συγκεκριμένο αρχείο
Πίνακας 14 Τρόποι κλήσης της open
Mode option ΕργασίαΑνάγνωση (read - default)
lt Ανάγνωση (read)gt Εγγραφή (write)raquo Προσθήκη (append)
+gt ή +lt Ανάγνωση και εγγραφή (read-write)| Διοχέτευση (pipe)
ΠροσοχήΚατά το άνοιγμα αρχείου για εγγραφή εάν το εν λόγω αρχείο δεν υπάρχει στο δίσκοδημιουργείται με την κλήση της open ενώ εάν το αρχείο ήδη υπάρχει τα περιεχόμενατου θα αντικατασταθούν μη αναστρέψιμα Εάν αντίθετα ανοίξουμε το αρχείο γιαπροσθήκη η συμπεριφορά είναι η ίδια με μόνη διαφορά ότι σε υπάρχον αρχείοπροσθέτει εγγραφές μετά την τελευταία υπάρχουσα εγγραφή
40Θα μπορούσε για πράδειγμα να είναι INPUT FILE41ʼΕχοντας μάθει για τη δομή του συστήματος διαχείρισης αρχείων πιστεύω είναι προφα-
νές ότι το όνομα του αρχείου μπορεί να διατυπωθεί με την πλήρη ή τη σχετική (ως προς τονκατάλογο εργασίας) ονομασία του
39
Perl
40
Perl
40