44
BIO 331 Αρχές και μέθοδοι Βιοπληροφορικής Ι Στοιχεία προγραμματισμού με τη γλώσσα Perl Βασίλης Ι. Προμπονάς Ερευνητικό Εργαστήριο Βιοπληροφορικής, Τμήμα Βιολογικών Επιστημών, Πανεπιστήμιο Κύπρου 1678 Λευκωσία Κύπρος ©Βασίλης Ι. Προμπονάς Λευκωσία, 2009

Perl Notes1

Embed Size (px)

Citation preview

Page 1: Perl Notes1

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

Page 2: Perl Notes1

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

Page 3: Perl Notes1

Περιεχόμενα

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

Page 4: Perl Notes1

ΠΕΡΙΕΧΟΜΕΝΑ

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

Page 5: Perl Notes1

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

Page 6: Perl Notes1

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

Page 7: Perl Notes1

Εισαγωγή

Επιπλέον η δυνατότητα αντικειμενοστρεφούς (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

Page 8: Perl Notes1

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

Page 9: Perl Notes1

Τεχνικές συμβουλές και συμβάσεις

ρων γραμμών - εντολών και θα πρέπει να μελετούνται με προσοχή Είναικαλή προγραμματιστική πρακτική ο κώδικάς που γράφετε να περιέχει αρ-κετά διευκρινιστικά σχόλια (δείτε περισσότερες οδηγίες στην ενότητα 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

Page 10: Perl Notes1

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

Page 11: Perl Notes1

Τεχνικές συμβουλές και συμβάσεις

οπότε στο τερματικό μας τυπώνεται το μήνυμα

Κώδικας 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

Page 12: Perl Notes1

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

Page 13: Perl Notes1

Τεχνικές συμβουλές και συμβάσεις

ΣημείωσηΣε όλα τα προγράμματα που θα γράφουμε στην 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

Page 14: Perl Notes1

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

Page 15: Perl Notes1

Μεταβλητές στην 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

Page 16: Perl Notes1

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

Page 17: Perl Notes1

Βαθμωτές (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

Page 18: Perl Notes1

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

Page 19: Perl Notes1

Βαθμωτές (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

Page 20: Perl Notes1

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

Page 21: Perl Notes1

Ευρετήρια (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

Page 22: Perl Notes1

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

Page 23: Perl Notes1

Τελεστές

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

Page 24: Perl Notes1

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

Page 25: Perl Notes1

Τελεστές

Πίνακας 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

Page 26: Perl Notes1

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

Page 27: Perl Notes1

Τελεστές

Παράδειγμα 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

Page 28: Perl Notes1

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

Page 29: Perl Notes1

Ομαδοποίηση δηλώσεων και εντολών - 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

Page 30: Perl Notes1

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

Page 31: Perl Notes1

Έλεγχος και επανάληψη

γλώσσα καλό θα είναι να μη χρησιμοποιείται Ο ∆ιερμηνευτής της 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

Page 32: Perl Notes1

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

Page 33: Perl Notes1

Έλεγχος και επανάληψη

κώδικα

Κώδικας 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

Page 34: Perl Notes1

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

Page 35: Perl Notes1

Έλεγχος και επανάληψη

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

Page 36: Perl Notes1

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

Page 37: Perl Notes1

Υποπρογράμματα - 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

Page 38: Perl Notes1

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

Page 39: Perl Notes1

Επέστρεψε βγες και πέθανε (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

Page 40: Perl Notes1

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

Page 41: Perl Notes1

Διαδικασίες εισόδου-εξόδου (ΙΟ)

Ως παράδειγμα θα δημιουργηθεί το αρχείο 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

Page 42: Perl Notes1

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

Page 43: Perl Notes1

Διαδικασίες εισόδου-εξόδου (ΙΟ)

κεκριμένο (φυσικό) αρχείο με τη χρήση της εντολής 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

Page 44: Perl Notes1

Perl

40