Βασικά στοιχεία της Perl - συμβολοσειρές, αριθμοί, πίνακες, κατακερματισμοί. Τύποι δεδομένων σε perl

Η γλώσσα προγραμματισμού Perl δημιουργήθηκε από τον Larry Wall το 1987, όταν εργαζόταν ως προγραμματιστής συστημάτων στην αμερικανική εταιρεία Unisys. Οι στόχοι του Larry στην ανάπτυξη μιας νέας γλώσσας προγραμματισμού αντικατοπτρίζονται στο όνομά της - PERL, που αργότερα στάθηκε ως Practical Extraction and Report Language, δηλαδή «μια πρακτική γλώσσα για την εξαγωγή «δεδομένων» και τη «δημιουργία» αναφορών».

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

Αν και, σύμφωνα με μια άλλη εκδοχή, ο Λάρι ονόμασε τη γλώσσα που δημιούργησε από την αρραβωνιαστικιά του.


Λάρι Γουόλ

Η ανάπτυξη της Perl επηρεάστηκε από τις γλώσσες Ada, Basic, Fortran, Lisp, Pascal και, φυσικά, τη γλώσσα C. Η Perl απορρόφησε διάφορες τάσεις στην επιστήμη των υπολογιστών: διαδικαστικός, αρθρωτός, λειτουργικός και αντικειμενοστραφής προγραμματισμός, μακρο κείμενο επεξεργασία, και επιπλέον - την κουλτούρα του λειτουργικού συστήματος Unix, με το πλούσιο σύνολο εντολών και βοηθητικών προγραμμάτων, την κομψή, καλά μελετημένη αρχιτεκτονική και την ενοποιημένη προσέγγιση στην παρουσίαση δεδομένων.

Unix κληρονομιά

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

Για όσους γνωρίζουν το λειτουργικό σύστημα Unix, αυτό το υλικό δεν θα είναι νέο. Αλλά για πολλούς προγραμματιστές MS-DOS και Windows, είναι σημαντικό να εξοικειωθούν με τις αρχές του προγραμματισμού που βασίζεται σε εργαλεία λογισμικού, που προέκυψαν και εξελίχθηκαν με το λειτουργικό σύστημα Unix. Οι διάσημοι προγραμματιστές Brian W. Kernighan και Philip Plauger έγραψαν ένα υπέροχο βιβλίο για αυτούς. Εδώ είναι τα κύρια σημεία αυτής της προσέγγισης.

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

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

Κατά την ανάπτυξη αυτών των μικρών προγραμμάτων, θα πρέπει να εστιάσετε στη μέγιστη ανεξάρτητη χρήση τους, ώστε να μπορούν να χρησιμοποιηθούν για την επίλυση άλλων προβλημάτων. Έτσι, σταδιακά δημιουργούνται εργαλεία (IS) για περαιτέρω καθολική χρήση.

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

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

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

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

Ευνοϊκοί παράγοντες

Η γλώσσα εξαπλώθηκε γρήγορα μεταξύ των χρηστών του Usenet. Παρά το γεγονός ότι το λειτουργικό σύστημα Unix (OS) για το οποίο δημιουργήθηκε η Perl είχε ήδη πολλά και ποικίλα εργαλεία για την επεξεργασία πληροφοριών κειμένου (awk, csh, grep, sed και άλλα), η νέα γλώσσα ερωτεύτηκε έναν τεράστιο αριθμό συστημάτων διαχειριστές και προγραμματιστές. Ήταν εύκολο στην εκμάθηση και τη χρήση: η σύνταξη ήταν παρόμοια με τη C, τα προγράμματα της Perl δεν χρειαζόταν πρώτα να μεταγλωττιστούν και ο πηγαίος κώδικας ήταν εύκολο να τροποποιηθεί. Και το πιο σημαντικό, ήταν πραγματικά μια πολύ πρακτική γλώσσα: με τη βοήθειά της, τα περισσότερα καθημερινά προβλήματα λύνονταν εύκολα - από τα πιο απλά έως τα πολύ σύνθετα.

Χρησιμοποιώντας ενεργά τη γλώσσα Perl, προγραμματιστές από διαφορετικές χώρες έστειλαν προτάσεις στον Larry Wall για να προσθέσουν νέες δυνατότητες σε αυτήν ή να βελτιώσουν τις υπάρχουσες. Σταδιακά, η Perl εξελίχθηκε από ένα εργαλείο επεξεργασίας κειμένου Unix σε ένα ισχυρό σύστημα προγραμματισμού γενικής χρήσης. Στα μέσα της δεκαετίας του 1990, καθώς αναπτύχθηκε το Διαδίκτυο, η Perl έγινε ένα αγαπημένο εργαλείο για webmasters για τη δημιουργία δυναμικών ιστοσελίδων και προγραμματισμού Διαδικτύου.

Λόγω των ισχυρών ενσωματωμένων δυνατοτήτων επεξεργασίας κειμένου, η Perl χρησιμοποιείται ευρέως για την επεξεργασία πληροφοριών σε μορφές HTML και XML.

Η Perl έχει γίνει βασικό συστατικό οποιουδήποτε πακέτου λειτουργικού συστήματος Unix (για παράδειγμα, FreeBSD, Linux ή Solaris). Επιπλέον, μέχρι σήμερα η Perl έχει εφαρμοστεί για όλες σχεδόν τις σύγχρονες πλατφόρμες υλικού (υπερυπολογιστές, RISC, Macintosh, Η/Υ, φορητοί υπολογιστές) και λειτουργικά συστήματα (AIX, Linux, MacOS, MS-DOS, NetWare, OS/2, QNX, Solaris , Windows, VMS και ούτω καθεξής).

Αυτό καθιστά δυνατή την εύκολη μεταφορά δημοφιλών προγραμμάτων Perl από το ένα λειτουργικό περιβάλλον στο άλλο.

Αναμφίβολα, η ευρεία χρήση του διευκολύνθηκε από το γεγονός ότι διανέμεται δωρεάν υπό τους όρους μιας από τις άδειες: είτε της Γενικής Δημόσιας Άδειας GNU (GPL) είτε της Καλλιτεχνικής Άδειας - επιλογή σας. Αλλά το κύριο πράγμα είναι ότι διαθέτει όλα τα εργαλεία για να βοηθήσει τέλεια τους επαγγελματίες και τους άπειρους προγραμματιστές όταν πρέπει να λύσουν γρήγορα διάφορα προβλήματα συστήματος και εφαρμογών - από τα πιο απλά έως τα πιο σύνθετα. Ως αποτέλεσμα, η Perl έχει γίνει ένα από τα πιο επιτυχημένα έργα στο κίνημα ανοιχτού κώδικα - μαζί με το Apache, το Linux, την PHP και την Python.

Ασυνήθιστη γλώσσα προγραμματισμού

Οι αρχές σχεδίασης της Perl είναι πολύ διαφορετικές από αυτές που χρησιμοποιήθηκαν στον προγραμματισμό πριν. Ο καινοτόμος χαρακτήρας της γλώσσας οφειλόταν στη μοναδική προσωπικότητα του συγγραφέα, Larry Wall, και στα ποικίλα ενδιαφέροντά του.

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

Ίσως το κύριο πλεονέκτημα του Larry ως συγγραφέα του Perl είναι ότι κατάφερε να δημιουργήσει μια γλώσσα που λαμβάνει υπόψη τις ιδιότητες και τις αρχές της φυσικής γλώσσας: πολυσημία καταστάσεων των κατασκευών, εύλογος πλεονασμός (και λόγω αυτής της στυλιστικής ποικιλομορφίας), μέγιστη προσαρμοστικότητα σε διαφορετικά επίπεδα της γνώσης των φυσικών ομιλητών, της ευελιξίας και της εκφραστικότητας των συντακτικών μέσων. Όλα αυτά δίνουν μια ιδιαίτερη δημιουργική γεύση στην ίδια τη διαδικασία της «γραφής» σε αυτή τη γλώσσα.

Όσοι γράφουν για τη γλώσσα Perl χρησιμοποιούν άθελά τους τους όρους «ιδίωμα», «μεταφορά», «συνώνυμο», «πλαίσιο» κ.λπ., που συνήθως χρησιμοποιούνται σε φυσικές γλώσσες. Και ο ίδιος ο Larry Wall, όταν περιγράφει τη γλώσσα Perl, χρησιμοποιεί ευρέως γλωσσικούς όρους: ουσιαστικό, ρήμα, πρόταση, ενικό και πληθυντικό, αντωνυμία.

Ο εξαιρετικός γλωσσολόγος B.L. Ο Whorf σημείωσε: «Η γλώσσα διαμορφώνει τον τρόπο σκέψης μας και καθορίζει τι μπορούμε να σκεφτούμε». Η ίδια ιδέα επιβεβαιώνεται από τον J. Bentley στο βιβλίο «Pearls of Programmers’ Creativity», περιγράφοντας μια περίπτωση όπου ήταν τα χαρακτηριστικά της γλώσσας προγραμματισμού APL που ώθησαν τον προγραμματιστή να βρει μια πρωτότυπη λύση σε ένα πρόβλημα με πίνακες. Υπό αυτή την έννοια, η Perl, ως γλώσσα για την υλοποίηση των σχεδίων του προγραμματιστή, δεν περιορίζει τη φαντασία του προγραμματιστή, του δίνει μέγιστη ελευθερία έκφρασης και μερικές φορές προτείνει ακόμη και μη τυπικές λύσεις.

Ως μειονεκτήματα της γλώσσας αναφέρονται τα ακόλουθα:

Γλωσσικές αρχές της Perl

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

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

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

$we->shall(do($it)) if $you->want($it); # ή
if $you->want($it) ( $we->shall(do($it)) )

Η αρχή της ελευθερίας στις φυσικές γλώσσες υποδηλώνει ότι υπάρχουν πάντα πολλές επιλογές για την έκφραση της ίδιας σκέψης. Όπως και στις φυσικές γλώσσες, στο Perl το ίδιο αποτέλεσμα μπορεί να επιτευχθεί με διάφορους τρόπους, χρησιμοποιώντας διαφορετικά εκφραστικά μέσα της γλώσσας. Αυτή είναι η λεγόμενη αρχή TIMTOWTDI - η συντομογραφία λέει "Tim Toady" και σημαίνει "Υπάρχουν περισσότεροι από ένας τρόποι να το κάνεις": "υπάρχουν περισσότεροι από ένας τρόποι να κάνεις κάτι". Σύμφωνα με αυτό, κάθε προγραμματιστής επιλέγει την έκδοση της γλωσσικής δομής που είναι πιο κατάλληλη για αυτόν σε μια συγκεκριμένη κατάσταση, πιο συνεπής με το στυλ ή το επίπεδο γνώσης της γλώσσας.

Αυτή η προσέγγιση είναι εντελώς αντίθετη με την αυστηρά επίσημη άποψη των γλωσσών προγραμματισμού, όταν οι κύριοι στόχοι της ανάπτυξης είναι η σαφήνεια και η ελαχιστοποίηση των γλωσσικών δομών. Αλλά από άποψη ψυχολογίας και γλωσσικής σκέψης, η «γλωσσική προσέγγιση» είναι από πολλές απόψεις πιο παραγωγική, όσο παράδοξη κι αν φαίνεται! Εξάλλου, διεγείρει τη δημιουργικότητα αντλώντας από την ανθρώπινη εμπειρία στη χρήση φυσικής γλώσσας - και η συγγραφή προγραμμάτων σε Perl γίνεται διασκεδαστική και ενδιαφέρουσα. Αυτός είναι πιθανώς ο λόγος που οι προγραμματιστές της Perl αγαπούν τόσο πολύ τη λέξη "διασκέδαση".

Πρώτες εκδόσεις και "Camel Book"

Ο Larry Wall άρχισε να αναπτύσσει την Perl το 1987 ενώ εργαζόταν ως προγραμματιστής στην Unisys. Η έκδοση 1.0 κυκλοφόρησε και ανακοινώθηκε στις 18 Δεκεμβρίου 1987 ως «αντικατάσταση» των awk και sed.

Το Perl 2 κυκλοφόρησε το 1988. Η κύρια καινοτομία σε αυτό ήταν ένας επανασχεδιασμένος μηχανισμός κανονικής έκφρασης.

Το Perl 3, που κυκλοφόρησε το 1989, απέκτησε τη δυνατότητα να επεξεργάζεται δυαδικές ροές δεδομένων.

Αρχικά, η μόνη τεκμηρίωση για την Perl ήταν μια ενιαία (πολύ μεγάλη) σελίδα. Το 1991 κυκλοφόρησε το βιβλίο Programming Perl (γνωστό σε πολλούς προγραμματιστές ως Camel Book λόγω της εικόνας στο εξώφυλλο), το οποίο έγινε το de facto πρότυπο γλώσσας.

Ταυτόχρονα, η γλωσσική έκδοση "αναβαθμίστηκε" στην έκδοση 4 - όχι τόσο για να υποδηλώνει σημαντικές αλλαγές, αλλά για να υποδείξει ότι αυτή η έκδοση της γλώσσας ήταν τεκμηριωμένη στο βιβλίο. Το Perl 4 πέρασε από μια σειρά εκδόσεων, που έληξε με το Perl 4.036 το 1993.

Perl 5

Η ανάπτυξη του Perl 5 ξεκίνησε το 1994. Ταυτόχρονα, δημιουργήθηκε η λίστα αλληλογραφίας perl5-porters για τον συντονισμό των εργασιών για τη μεταφορά του Perl 5 σε διάφορες πλατφόρμες. Παραμένει το κύριο φόρουμ για την ανάπτυξη, τη συντήρηση και τη μεταφορά του Perl 5.

Το Perl 5.000 κυκλοφόρησε στις 17 Οκτωβρίου 1994. Περιλάμβανε έναν εντελώς ξαναγραμμένο διερμηνέα, καθώς και πολλά νέα χαρακτηριστικά γλώσσας, όπως αντικείμενα, αναφορές, τοπικές μεταβλητές (my $var_name) και λειτουργικές μονάδες. Οι ενότητες ήταν ένα ιδιαίτερα σημαντικό μέρος, καθώς παρείχαν έναν μηχανισμό για την επέκταση της γλώσσας χωρίς τροποποίηση του διερμηνέα. Αυτό επέτρεψε στον διερμηνέα να σταθεροποιηθεί, αλλά ταυτόχρονα έδωσε στους απλούς προγραμματιστές της Perl την ευκαιρία να προσθέσουν νέες δυνατότητες στη γλώσσα. Το Perl 5 είναι ακόμα σε ενεργό ανάπτυξη μέχρι σήμερα.

Το Perl 5.001 κυκλοφόρησε στις 13 Μαρτίου 1995. Το Perl 5.002 κυκλοφόρησε στις 29 Φεβρουαρίου 1996, με υποστήριξη νέου πρωτότυπου. Αυτό επέτρεψε στους συντάκτες της ενότητας να δημιουργήσουν συναρτήσεις που συμπεριφέρονταν ακριβώς όπως οι ενσωματωμένες λειτουργίες της Perl. Η έκδοση 5.003 της Perl κυκλοφόρησε στις 25 Ιουνίου 1996 και διόρθωσε προβλήματα ασφαλείας.

Μία από τις πιο σημαντικές εξελίξεις στην ιστορία του Perl 5 συνέβη εκτός της ίδιας της γλώσσας και ήταν συνέπεια της υποστήριξης της μονάδας. Στις 26 Οκτωβρίου 1995, το CPAN (Comprehensive Perl Archive Network) ξεκίνησε τις εργασίες του, το οποίο έγινε αποθήκη μονάδων Perl, καθώς και ο πηγαίος κώδικας της ίδιας της γλώσσας. Αυτή τη στιγμή, το δίκτυο διαθέτει περισσότερες από 25.000 ενότητες που έχουν δημιουργηθεί από περισσότερους από 8.000 προγραμματιστές.

Το Perl 5.004 κυκλοφόρησε στις 15 Μαΐου 1997 και περιείχε, μεταξύ άλλων, το πακέτο UNIVERSAL, το οποίο έδωσε στη γλώσσα ένα βασικό αντικείμενο από το οποίο προέρχονταν αυτόματα όλες οι κλάσεις. Περιλαμβάνεται επίσης η δυνατότητα υποβολής ερωτημάτων για την έκδοση της ενότητας. Εκτός από αυτό, η Perl άρχισε να υποστηρίζει τα Microsoft Windows, καθώς και μια σειρά από άλλα λειτουργικά συστήματα.

Το Perl 5.005 κυκλοφόρησε στις 22 Ιουνίου 1998. Αυτή η έκδοση περιλάμβανε αρκετές βελτιώσεις στον επεξεργαστή κανονικών εκφράσεων, νέα αγκίστρια υποστήριξης που χρησιμοποιούν τις ενότητες B::*, τον τελεστή qr// quote για κανονικές εκφράσεις, μια μεγάλη επιλογή άλλων νέων λειτουργικών μονάδων και υποστήριξη για έναν αριθμό λειτουργικών συστημάτων, ιδίως BeOS.

δεκαετία του 2000

Το Perl 5.6 κυκλοφόρησε στις 22 Μαρτίου 2000. Οι σημαντικές αλλαγές περιελάμβαναν υποστήριξη για συστήματα 64-bit, αναπαράσταση συμβολοσειρών Unicode, υποστήριξη για μεγάλα αρχεία (αρχεία μεγαλύτερα από 2 GB) και τη λέξη-κλειδί μας. Κατά την ανάπτυξη του Perl 5.6, ελήφθη η απόφαση να αλλάξει το σχήμα ονομασίας της έκδοσης ώστε να είναι πιο συνεπές με άλλα έργα ανοιχτού κώδικα. Η έκδοση 5.005_63 ακολουθήθηκε από την έκδοση 5.5.640. σύμφωνα με το σχέδιο, στις εκδόσεις υπό ανάπτυξη έπρεπε να εκχωρηθούν μονοί αριθμοί, σε σταθερές εκδόσεις - ζυγοί αριθμοί.

Το 2000, ο Larry Wall απηύθυνε ένα κάλεσμα προς την κοινότητα να συζητήσει ενεργά τις προτάσεις για την επόμενη έκδοση του Perl. Το αποτέλεσμα αυτής της συζήτησης ήταν 361 RFC (Αίτηση για Σχόλια) που χρησιμοποιήθηκαν στην ανάπτυξη του Perl 6.

Το 2001, ξεκίνησαν οι εργασίες για ένα τελικό έγγραφο που συνοψίζει τις προτάσεις για μια νέα γενιά Perl. Το αποτέλεσμα δεν παρουσιάστηκε ως επίσημο έγγραφο, αλλά ως περίληψη όλων των RFC. Μέχρι εκείνη τη στιγμή, το Perl 6 υπήρχε αποκλειστικά ως περιγραφή γλώσσας.

Το Perl 5.8 κυκλοφόρησε για πρώτη φορά στις 18 Ιουλίου 2002 και από τότε έχει λάβει ετήσιες ενημερώσεις. Η τελευταία έκδοση του Perl 5.8, με αριθμό 5.8.9, κυκλοφόρησε στις 14 Δεκεμβρίου 2008. Το Perl 5.8 βελτίωσε την υποστήριξη Unicode, πρόσθεσε μια νέα υλοποίηση I/O, πρόσθεσε υποστήριξη πολλαπλών νημάτων, αύξησε την αριθμητική ακρίβεια και πρόσθεσε αρκετές νέες ενότητες.

Το 2004, ξεκίνησαν οι εργασίες για τη Σύνοψη, που αρχικά προοριζόταν ως μια σειρά εγγράφων που συνοψίζουν το τελικό έγγραφο που αναφέρθηκε παραπάνω. Ωστόσο, σταδιακά αυτή η σειρά εγγράφων έγινε η προδιαγραφή Perl 6. Τον Φεβρουάριο του 2005, ο Otrius Tan άρχισε να εργάζεται στο Pugs, έναν διερμηνέα Perl 6 γραμμένο στο Haskell. Αυτή ήταν η πρώτη πραγματική προσπάθεια να γίνει πραγματικότητα το Perl 6. Αυτή η απόπειρα έσβησε το 2006.

Όταν είσαι πάνω από 20

Στις 18 Δεκεμβρίου 2007, η 20ή επέτειος του Perl 1.0, κυκλοφόρησε το Perl 5.10.0. Αυτή η έκδοση περιείχε μια σειρά από αξιοσημείωτες καινοτομίες που την έφεραν πιο κοντά στο Perl 6. Μερικές από αυτές τις καινοτομίες ήταν νέες δηλώσεις διακόπτη (που ονομάζονται "δόθηκαν"/"πότε"), ενημερώσεις σε κανονικές εκφράσεις και ένας "έξυπνος" τελεστής αντιστοίχισης "~~ ".


Επέτειος "Μαργαριτάρι".

Περίπου αυτή την περίοδο, ξεκίνησε σοβαρά η ανάπτυξη μιας νέας υλοποίησης του Perl 6, γνωστής ως Rakudo Perl, που αναπτύχθηκε σε συνδυασμό με την εικονική μηχανή Parrot. Από τον Νοέμβριο του 2009, το Rakudo Perl ενημερώνεται τακτικά κάθε μήνα και αυτή τη στιγμή είναι η πληρέστερη εφαρμογή του Perl 6.

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

Στις 12 Απριλίου 2010, το Perl 5.12.0 κυκλοφόρησε στο κοινό. Στα αξιοσημείωτα χαρακτηριστικά περιλαμβάνονται η υποστήριξη για τη σύνταξη του νέου πακέτου NAME VERSION, ο τελεστής Yada Yada (που χρησιμεύει για τη σήμανση κώδικα κράτησης θέσης που δεν έχει ακόμη εφαρμοστεί), μια πλήρης λύση στο "πρόβλημα Y2038", υπερφόρτωση τελεστών τυπικής έκφρασης, υποστήριξη για DTrace (ένα δυναμικό ίχνος), καθώς και πλήρη υποστήριξη για το πρότυπο Unicode 5.2.

Το Perl 5.12.2 κυκλοφόρησε στις 7 Σεπτεμβρίου 2010 και το Perl 5.12.3 κυκλοφόρησε στις 21 Ιανουαρίου 2011. Αυτές οι εκδόσεις περιέχουν ενημερώσεις λειτουργικών μονάδων καθώς και ορισμένες αλλαγές τεκμηρίωσης. Η έκδοση 5.12.4 κυκλοφόρησε στις 20 Ιουνίου 2011. Η τελευταία έκδοση αυτού του κλάδου, 5.12.5, κυκλοφόρησε στις 10 Νοεμβρίου 2012.

Τελευταίο πενταετές πρόγραμμα

Το Perl 5.14 κυκλοφόρησε στις 14 Μαΐου 2011. Η υποστήριξη JSON έγινε ενσωματωμένη ξεκινώντας από την έκδοση 5.14.2. Η τελευταία έκδοση αυτού του κλάδου, 5.14.4, κυκλοφόρησε στις 10 Μαρτίου 2013.

Το Perl 5.16 κυκλοφόρησε στις 20 Μαΐου 2012. Μια σημαντική καινοτομία είναι η δυνατότητα καθορισμού της επιθυμητής έκδοσης του Perl που θα μιμηθεί, επιτρέποντας στους χρήστες να ενημερώσουν το Perl διατηρώντας παράλληλα τη λειτουργικότητα παλαιότερων σεναρίων που διαφορετικά θα γίνονταν ασύμβατα με τη νέα έκδοση. Ο πυρήνας Perl 5.16 υποστηρίζει Unicode 6.1.

Το Perl 5.18 κυκλοφόρησε στις 18 Μαΐου 2013. Σημαντικές καινοτομίες περιλαμβάνουν νέα dtrace hook, λεξιλογικές συναρτήσεις, αύξηση του αριθμού των λειτουργιών που περιλαμβάνονται στον πυρήνα, αναθεώρηση της εφαρμογής κατακερματισμών για λόγους ασφαλείας, υποστήριξη για Unicode 6.2.

Στις 27 Μαΐου 2014, κυκλοφόρησε μια νέα σταθερή έκδοση - Perl 5.20.0. Η ανάπτυξη διήρκεσε περίπου 12 μήνες, ξεκινώντας με την Perl 5.18.0, και περιέχει περίπου 470.000 τροποποιημένες γραμμές μεταξύ 2.900 αρχείων από 124 συγγραφείς.

Το Perl 5.22.1 κυκλοφόρησε τον Δεκέμβριο του 2015. Η ανάπτυξη κράτησε 6 μήνες.

Στις 9 Μαΐου 2016, κυκλοφόρησε μια νέα σταθερή έκδοση της γλώσσας προγραμματισμού Perl 5.24.0. Η ανάπτυξη διήρκεσε περίπου 11 μήνες, ξεκινώντας με την Perl 5.22.0, και περιέχει περίπου 360.000 τροποποιημένες γραμμές μεταξύ 1.800 αρχείων από 77 συντάκτες.

Σύμφωνα με στοιχεία του Ιουλίου 2016, ο δείκτης TIOBE, ο οποίος μετρά την αύξηση της δημοτικότητας των γλωσσών προγραμματισμού, έδειξε ότι η Perl κατέλαβε την 9η θέση:

Αυτό είναι 2 θέσεις υψηλότερα από πέρυσι.

Perl 6

Όπως σημειώνεται στη Wikipedia, η Perl 6 είναι η επόμενη έκδοση της γλώσσας προγραμματισμού Perl (από δομική άποψη, η Perl 6 είναι πιο βολικό να θεωρηθεί ως ανεξάρτητη γλώσσα προγραμματισμού). Είναι μια επαναστατική εξέλιξη της γλώσσας, η τελευταία γράφτηκε σχεδόν «από την αρχή». Για πρώτη φορά στην ιστορία της Perl, η ανάπτυξη μιας νέας έκδοσης ξεκίνησε με τη συγγραφή των προδιαγραφών, οι οποίες εξακολουθούν να υπόκεινται σε αλλαγές μέχρι σήμερα.

Το Perl 6, κατά τη μεταγλώττιση ενός προγράμματος, δημιουργεί bytecode, ο οποίος στη συνέχεια εκτελείται από μια εικονική μηχανή. Η ίδια προσέγγιση χρησιμοποιείται στις τεχνολογίες Java και .NET Framework.

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

Η ανάπτυξη του Perl 6 ξεκίνησε το 2000 και συνεχίζεται μέχρι σήμερα.

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

Ο Larry Wall διακήρυξε αστειευόμενος τις τρεις κύριες αρετές ενός προγραμματιστή: τεμπελιά, ανυπομονησία και έπαρση. Κατά τη γνώμη του, η Perl έχει σχεδιαστεί για να πληροί αυτές τις ιδιότητες προγραμματιστών.

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

Μια τιμή ονομάζεται κλιμακωτή ποσότητα ή απλά κλιμακωτή. Τα παρακάτω είναι παραδείγματα βαθμωτών τιμών που χρησιμοποιούνται στο Perl:
- Δεκαδικός: 127 ή 127,0 ή 1,27E2
- Δεκαεξαδικό: Ox7F ή 0x7f
- Οκταδικό: 0177 (το πρώτο 0 δείχνει ότι χρησιμοποιείται οκταδικό)
- Συμβολοσειρά: "Hello World\n" ή "Hello World"

Για παράδειγμα, η ακόλουθη εντολή χρησιμοποιεί το πρόγραμμα εντοπισμού σφαλμάτων Perl για να εκτυπώσει τον οκταδικό αριθμό 0177, που αντιστοιχεί στον δεκαδικό αριθμό 127:

D.B.<4>r 0177 127

Η Perl μεταφράζει τα δεδομένα στην εσωτερική τους μορφή. Όταν η Perl εκτυπώνει οκταδικές ή δεκαεξαδικές τιμές, τις μετατρέπει πρώτα σε δεκαδική μορφή, όπως φαίνεται.

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

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

Σημείωση: Εάν προγραμματίζετε σε C και έχετε χρησιμοποιήσει αυτόματη διαίρεση ακεραίων με περικοπή ακέραιων αριθμών, τότε όταν προγραμματίζετε σε Perl, πρέπει να θυμάστε να εκτελείτε την περικοπή χειροκίνητα χρησιμοποιώντας τη συνάρτηση int().

Η ακόλουθη εντολή δείχνει πώς η Perl χειρίζεται ακέραιους αριθμούς και αριθμούς κινητής υποδιαστολής:

Εκτύπωση 6&3; # θα εκτυπώσει 2 εκτύπωση 6,9 & 3,1 # εκτύπωση 7 / 2 # θα εκτυπώσει 2,3333 όχι μια ακέραια εκτύπωση int(7/3) # θα εκτυπώσει 2

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

Η Perl υποστηρίζει επίσης την έννοια των boolean τιμών, αλλά δεν έχει ειδικό τύπο για να τις περιγράψει. Όπως και στο C, μια αριθμητική τιμή θεωρείται αληθής εάν δεν είναι μηδέν. Επιπλέον, μια τιμή συμβολοσειράς αντιμετωπίζεται ως αληθής εάν δεν είναι ίση με "" ή "0". Ορισμένοι τελεστές Boolean όπως<>> (μεγαλύτερο από), επιστρέψτε ένα ως τιμή<истинно>και μηδέν - ως<ложно>.

Έτσι, το σενάριό σας θα πρέπει απλώς να αντιμετωπίζει τις μη μηδενικές τιμές τόσο των τύπων συμβολοσειράς όσο και των αριθμητικών τύπων ως τιμές boolean<истинно>. Τα σενάρια Perl μπορούν να ομαδοποιήσουν τις βαθμωτές τιμές μαζί και να δημιουργήσουν μια λίστα. Εάν ένα σενάριο αποθηκεύει μια λίστα σε κάποια μεταβλητή, τότε αυτή η μεταβλητή γίνεται πίνακας.

ΜΕΤΑΒΛΗΤΕΣ

Η Perl υποστηρίζει τρεις τύπους μεταβλητών: βαθμωτές, πίνακες και συσχετιστικούς πίνακες. Όπως και στο C, τα ονόματα των μεταβλητών γράφονται με διάκριση μεταξύ πεζών και κεφαλαίων γραμμάτων. Έτσι, τα ονόματα VAR, Var και var περιγράφουν διαφορετικές μεταβλητές. Ένα σενάριο μπορεί να έχει μια βαθμωτή μεταβλητή που ονομάζεται var και μια μεταβλητή πίνακα που ονομάζεται επίσης var. Θα διαφέρουν σε Perl ανάλογα με το πλαίσιο.

Σημείωση: Οι μεταβλητές Perl δεν είναι πληκτρολογημένες, όπως είναι στο C. Για παράδειγμα, μια βαθμωτή μεταβλητή μπορεί να περιέχει οποιονδήποτε τύπο βαθμωτών και η χύτευση τύπου είναι αυτόματη. Επίσης, όπως ίσως έχετε ήδη παρατηρήσει, οι μεταβλητές στο Perl δεν χρειάζεται απαραίτητα να δηλώνονται. Εάν μια μεταβλητή δεν δηλωθεί, η Perl την αντιμετωπίζει ως καθολική. Παρακάτω θα μάθετε για τη δήλωση μεταβλητών και το εύρος τους.

ΚΛΙΜΑΚΕΣ ΜΕΤΑΒΛΗΤΕΣ

Όπως σημειώθηκε, μια βαθμωτή μεταβλητή μπορεί να περιέχει μία μόνο τιμή. Στην Perl, τα ονόματα των βαθμωτών μεταβλητών αρχίζουν πάντα με ένα ($). Η ακόλουθη έκφραση εκχωρεί στη βαθμωτή μεταβλητή $age την τιμή 35 και στη μεταβλητή $name την τιμή συμβολοσειράς . Στη συνέχεια, η συνάρτηση εκτύπωσης χρησιμοποιείται για την εκτύπωση της τιμής κάθε μεταβλητής:

$ηλικία = 35; $name = "Μπομπ"; εκτύπωση ($name,"is",$age);

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

C:\PERL> Perl SCALAR.PL Ο Μπομπ είναι 35

ΣΥΣΚΕΥΕΣ

Όπως αναφέρθηκε παραπάνω, οι πίνακες είναι μεταβλητές που λαμβάνουν ως τιμή μια λίστα με βαθμωτές τιμές. Το παρακάτω κείμενο του προγράμματος Perl απεικονίζει τη δήλωση των μεταβλητών του πίνακα και την αρχικοποίησή τους:

@days = ("Κυρ", "Δευτέρα", "Τρί", "Τετ", "Πέμ", "Παρ", "Σάββατο"); print(@days); # θα εκτυπώσει την εκτύπωση "SunMonTueWedThuFriSat" ($days); Το # θα εκτυπώσει "Πέμ" @weekdays = @days; # value ("Δευτ", "Τρί", "Τετ", "Πέμ", "Παρ") @emptylist = (); # λίστα αναμονής

Αναφορά σε μεταβλητές τύπου<массив>συνήθως ξεκινά με ένα σύμβολο (@) και ακολουθείται από τιμές σε αγκύλες ().Όπως στον προγραμματισμό C, οι δείκτες πίνακα για σενάρια είναι πάντα μεταβλητές ακέραιου τύπου, οι οποίες συνήθως ξεκινούν με μηδενική τιμή. Θα δείτε εξαιρέσεις από αυτούς τους δύο κανόνες στα παραδείγματα που θα εξηγηθούν σε αυτό το κεφάλαιο. Η τρίτη έκφραση ($days) είναι ένα παράδειγμα πίνακα που αναφέρεται σε μια βαθμωτή τιμή. Δεδομένου ότι περιέχει μόνο ένα στοιχείο, η τιμή που προκύπτει είναι βαθμωτή.

Εάν χρησιμοποιείτε το σύμβολο ($) αντί για το σύμβολο (@), το σενάριο θα αναφέρεται σε μια βαθμωτή τιμή. Αυτή η σημείωση είναι πολύ σημαντική. Οι αγκύλες υποδεικνύουν ότι το σενάριο αναφέρεται σε έναν πίνακα. Το σύμβολο $, με τη σειρά του, υποδεικνύει μια αναφορά σε μια βαθμωτή τιμή. Η εκκίνηση του πίνακα @weekdays γίνεται επιλέγοντας μέρος του πίνακα @days. Στο προηγούμενο παράδειγμα, ο πίνακας @days χρησιμοποιήθηκε χωρίς ευρετήριο. Όταν το ευρετήριο παραλείπεται, το Perl αναφέρεται σε ολόκληρο τον πίνακα. Ομοίως, στο προηγούμενο παράδειγμα, ο πίνακας @days αρχικοποιήθηκε με μια λίστα κυριολεκτικών.

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

@stuff = ($ηλικία, $όνομα) @FriendsOfMine = ("Joe","Mary", @FriendsOfYours);

Το παρακάτω παράδειγμα χρησιμοποιεί τμήματα πινάκων:

@weekend = @days ; # αποτέλεσμα ("Κυρ","Σάββατο") εκτύπωση (@ημέρες); # θα δώσει έξοδο "MonTueWedThuPriSunSat"

Εάν ένα σενάριο χρησιμοποιεί μια μεταβλητή πίνακα στο πλαίσιο ενός βαθμωτή, τότε η τιμή είναι ο αριθμός των στοιχείων του πίνακα. Ένα βαθμωτό πλαίσιο είναι ένα πλαίσιο όπου μόνο οι βαθμωτές τιμές έχουν νόημα. Για παράδειγμα, η ακόλουθη έκφραση χρησιμοποιεί το βαθμωτό πλαίσιο για τον πίνακα στοιχείων για να προσδιορίσει τον αριθμό των στοιχείων που περιέχονται στον πίνακα. Εάν ο αριθμός των στοιχείων είναι μεγαλύτερος ή ίσος με 2, τότε το σενάριο εμφανίζει ένα μήνυμα και τερματίζει την εκτέλεση:

(@stuff >= 2) || die "Πάρα πολλά πράγματα!\n";

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

Η Perl υποστηρίζει επίσης μια ειδική κατασκευή μεταβλητής $# που επιστρέφει την τελευταία τιμή δείκτη σε έναν πίνακα. Για παράδειγμα, η παρακάτω έκφραση χρησιμοποιεί $[ για να καθορίσει την αρχική τιμή δείκτη ενός πίνακα και $# για να καθορίσει το τελευταίο στοιχείο του πίνακα. Σε αυτήν την περίπτωση, χρησιμοποιώντας την έκφραση for, εμφανίζονται οι τιμές καθενός από τα στοιχεία:

Για ($i =$[; $i<= $#stuff; $i++) { print $stuff[$i]; }

Ο γραμμένος βρόχος for μπορεί να αντικατασταθεί με την ακόλουθη ισοδύναμη έκφραση:

Εκτύπωση @stuff;

ΡΟΛΟΣ ΠΛΑΙΣΙΟΥ ΓΙΑ ΜΕΤΑΒΛΗΤΕΣ βαθμωτών και διανυσματικών τύπων

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

@an_array = (1,2,3,4,5); $a_scalar = (1,2,3,4,5);

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

Εκτύπωση $assoc(1,2); print @assoc(1,2);

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

@x = @list; $x = @list;

ΣΥΝΕΡΓΑΤΙΚΕΣ ΣΥΣΚΕΥΕΣ

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

$ages("Bob") = 35; $ages("Mary") = 25; $, = " "; # αλλαγή διαχωριστή εξόδου για τελεστή εκτύπωσης print @ages("Bob","Mary"); Το # θα εκτυπώσει πλήκτρα εκτύπωσης "25 35" (%ages); # θα εκτυπώσει το "Bob Mary" για $name (keys(%ages)) (εκτύπωση "$name is $ages($keys)\n";)

Όπως μπορείτε να δείτε, το πρόγραμμα εκχωρεί τιμές στη μεταβλητή "$," (μια βαθμωτή μεταβλητή της οποίας το όνομα είναι κόμμα). Το σενάριο χρησιμοποιεί αυτήν την έκφραση έτσι ώστε όταν η δήλωση εκτύπωσης χρησιμοποιείται αργότερα, τα δεδομένα εξόδου δεν συγχωνεύονται ο ένας με τον άλλο. Ειδικές μεταβλητές όπως "$," συζητούνται αργότερα σε αυτό το κεφάλαιο. Οι συσχετιστικοί πίνακες αναγνωρίζονται χρησιμοποιώντας σγουρά σιδεράκια. Όπως και με τους πίνακες, τα ευρετήρια δεν χρησιμοποιούνται όταν γίνεται αναφορά σε έναν ολόκληρο συσχετιστικό πίνακα. Για παράδειγμα, το link@ages("Bob", "Mary") χρησιμοποιεί ευρετήρια σε παρένθεση, τα οποία δείχνουν σε έναν συσχετιστικό πίνακα. Το πρόθεμα @ υποδηλώνει ότι μιλάμε για πίνακα. Ομοίως, η χρήση ενός σήματος δολαρίου μπροστά από έναν πίνακα υποδηλώνει ότι χρησιμοποιείται μια κλιμακωτή ποσότητα.

Σημείωση: Εάν καθορίζονται δύο κλειδιά, τότε μαζί με το σύμβολο @ αυτό υποδηλώνει ότι μιλάμε για μέρος ενός συσχετιστικού πίνακα και το αποτέλεσμα θα πρέπει να έχει τη μορφή λίστας. Αυτή η έκφραση είναι ισοδύναμη με #ages ("Bob"), #ages ("Mary"). που έχει την τιμή (35, 25).

Η έκφραση print keys(%ages) καλεί τον τελεστή κλειδιών, ο οποίος επιστρέφει την πλήρη λίστα των κλειδιών σε έναν συσχετιστικό πίνακα. Μια αναφορά %ages με το σύμβολο ποσοστού ως πρόθεμα σημαίνει ότι η αναφορά αναφέρεται σε ολόκληρο τον συσχετιστικό πίνακα. Σημειώστε ότι ο βρόχος for αναφέρεται σε μεταβλητές που περικλείονται σε διπλά εισαγωγικά. Τέλος, το τελευταίο παράδειγμα που συζητήθηκε χρησιμοποιεί επίσης τον τελεστή κλειδιών και εισάγει έναν βρόχο for για να εκτυπώσει όλους τους συνδυασμούς του συσχετιστικού πίνακα. Ο βρόχος for αναφέρεται σε μεταβλητές που περικλείονται σε διπλά εισαγωγικά. Η Perl, με τη σειρά της, θα αντικαταστήσει τις τιμές που αναφέρονται από τις μεταβλητές ενώ αναλύει τη συμβολοσειρά. Οι προγραμματιστές ονομάζουν αυτή τη διαδικασία υποκατάσταση ή παρεμβολή μεταβλητής.

Σημείωση: Η Perl δεν ερμηνεύει μεταβλητές που περιέχουν συμβολοσειρές με ένα εισαγωγικό.

PERL OPERATORS

Ενώ τα δεδομένα και οι τύποι μεταβλητών της Perl είναι αρκετά διαφορετικοί από εκείνους της C, οι τελεστές και οι εκφράσεις της Perl θα πρέπει να αισθάνονται πολύ πιο οικεία. Όλοι οι τελεστές C είναι παρόντες στο Perl εκτός από τον τελεστή τύπου, τον τελεστή περιεχομένου *ptr και τον τελεστή var.member ή var->member. Επιπλέον, η Perl εισάγει πολλούς νέους τελεστές για χρήση σε λειτουργίες όπως σύγκριση συμβολοσειρών και χειρισμός συμβολοσειρών.

ΑΡΙΘΜΗΤΙΚΟΙ ΛΕΙΤΟΥΡΓΟΙ

Οι αριθμητικοί τελεστές λειτουργούν με αριθμητικές τιμές και το αποτέλεσμά τους είναι ένας αριθμός. Εάν μια παράσταση περιλαμβάνει τελεστές συμβολοσειράς, η Perl μετατρέπει τις τιμές συμβολοσειράς σε αριθμητικές τιμές πριν από την αξιολόγηση της έκφρασης. Η Perl μετατρέπει τις συμβολοσειρές σε αριθμούς με παρόμοιο τρόπο με τη συνάρτηση C atof() στις βιβλιοθήκες χρόνου εκτέλεσης. Η Perl υποστηρίζει επί του παρόντος τους ακόλουθους αριθμητικούς τελεστές:
- + προσθήκη
- - αφαίρεση ή αλλαγή προσήμου
- * πολλαπλασιασμός
- / διαίρεση (μόνο για αριθμούς κινητής υποδιαστολής)
- % modulo (μόνο για ακέραιες τιμές)

Ας δούμε παραδείγματα των ακόλουθων αριθμητικών πράξεων στο Perl:

$x = 2,5; $y = 3; εκτύπωση ($x + 2*$y); Το # θα εκτυπώσει 8,5 εκτυπώσεις (7 / $y). # θα εκτυπώσει 2,3333333 print int (7 / $y); Το # θα εκτυπώσει 2 εκτυπώσεις (7 % $y); Το # θα εκτυπώσει 1 εκτύπωση (7,5 % $y). Το # θα εκτυπώσει 1

Σημείωση: Στο Perl, ο τελεστής διαίρεσης καταλήγει πάντα σε έναν αριθμό κινητής υποδιαστολής και το αποτέλεσμα της λήψης ενός modulo αριθμού ενός άλλου είναι ένας ακέραιος και και οι δύο τελεστές μετατρέπονται πρώτα σε έναν ακέραιο τύπο.

Εξετάστε την ακόλουθη λειτουργία modulo:

Εκτύπωση (7,9% 3,6); Το # θα δώσει 1 ίδιο (7% 3) = 1

Η Perl υποστηρίζει επίσης τελεστές αύξησης και μείωσης:
- ++ μείωση σε μορφή προθέματος ή μεταθέματος
- - προσαύξηση σε μορφή προθέματος ή μετάθεμα. Ας δούμε παραδείγματα πράξεων αύξησης και μείωσης:

$x = 4; +$x; εκτύπωση $x; # θα εκτυπώσει 5 $y = $x-; Το # θα μειώσει το x αφού εκχωρήσει στο y την τιμή του x print "$y $x" # print 5 4

Τέλος, η Perl παρέχει έναν αριθμητικό τελεστή για την εκθετικότητα (**). Εξετάστε τα ακόλουθα παραδείγματα χρήσης της πράξης εκθέσεως:

$x = 2 ** 3; # αποτέλεσμα 8 $x = 2 ** 0,5; # τετραγωνική ρίζα 2 $x = -2 ** -3; # 1/(-2 κυβικά), αποτέλεσμα -1/8 (-0,125)

ΧΕΙΡΙΣΤΕΣ ΣΚΥΛΩΝ

Οι τελεστές bitwise λειτουργούν στη δυαδική αναπαράσταση ακεραίων αριθμών και έχουν ένα ακέραιο αποτέλεσμα. Εάν ο τελεστής είναι συμβολοσειρά ή κλάσμα, η Perl τον μετατρέπει πρώτα σε ακέραιο και επεξεργάζεται τον τελεστή χρησιμοποιώντας την αναπαράσταση 32-bit. Όλοι οι τελεστές C bitwise αντιπροσωπεύονται σε Perl:
- | bitwise Ή
- & bitwise ΚΑΙ
- ^ αποκλειστικό bitwise Ή
- ~ αντιστροφή bit
- << сдвиг влево
- >> μετατόπιση δεξιά

Εξετάστε τα ακόλουθα παραδείγματα πράξεων bitwise:

$x = 5; #101 σε δυαδικό $y = 3; #011 σε δυαδική εκτύπωση $x | $y; # 7 (111) εκτύπωση $x & $y; # 1 (001) εκτύπωση $x ^ $y # 6 (110) εκτύπωση $x & ~1; # 4 (100) εκτύπωση $x<< 2 # 20 (10100) print $x >> 1 # 2 (10)

Όπως και στο C, η συμπεριφορά των τελεστών μετατόπισης δεξιά εξαρτάται από την εφαρμογή της γλώσσας όταν ο τελεστής είναι αρνητικός.

ΣΥΓΚΡΙΤΙΚΟΙ ΧΕΙΡΙΣΤΕΣ

Οι τελεστές σύγκρισης συγκρίνουν τις τιμές δύο τελεστών. Ακριβώς όπως με τους αριθμητικούς τελεστές, η Perl μετατρέπει τους τελεστές συμβολοσειρών σε αριθμητικούς τελεστές πριν από τη σύγκριση. Για να επιτρέπεται σε ένα σενάριο να συγκρίνει συμβολοσειρές που δεν είναι αριθμοί, η Perl έχει επιπλέον τελεστές σύγκρισης συμβολοσειρών. Αυτοί οι τελεστές συγκρίνουν συμβολοσειρές χρησιμοποιώντας τιμές ASCII. Εάν μια αριθμητική τιμή δίνεται ως ο τελεστής μιας σύγκρισης συμβολοσειρών, μετατρέπεται πρώτα σε συμβολοσειρά. Ο Πίνακας 12.1 παραθέτει τους τελεστές σύγκρισης:

Αριθμός Συμβολοσειράς Τιμή = = ισοδύναμο ίσον!= δεν είναι ίσο > gt μεγαλύτερο από< it меньше чем >= gе μεγαλύτερο ή ίσο με<= lе меньше или равно <=>cmp μη ίσο (υπογεγραμμένο αποτέλεσμα)

Τραπέζι 12.1. Τελεστές σύγκρισης Perl.

Το αποτέλεσμα μιας πράξης σύγκρισης είναι ένα εάν η σύγκριση είναι αληθής και μηδέν διαφορετικά. Ωστόσο, η τελευταία επέμβαση (<=>ή cmp) μπορεί να επιστρέψει τις τιμές -1, 0 ή 1 ανάλογα με το αν η τιμή του πρώτου τελεστή είναι μικρότερη, ίση ή μεγαλύτερη από τον δεύτερο.

Σημείωση: Ο τελεστής cmp της Perl συμπεριφέρεται παρόμοια με τη συνάρτηση Strcmp() της βιβλιοθήκης χρόνου εκτέλεσης C.

Εξετάστε το ακόλουθο παράδειγμα σύγκρισης:

$x = 5; Το # x ισούται με 5 εκτυπώσεις ($x< 4); # если false, то выведет 0

ΛΟΓΙΚΟΙ ΧΕΙΡΙΣΤΕΣ

Οι λογικοί τελεστές αναλύουν τις παραστάσεις Boole και επιστρέφουν τιμές<истинно>ή<ложно>σαν άποτέλεσμα. Η Perl αντιμετωπίζει τους τελεστές των λογικών πράξεων ως Boolean τιμές, δηλ. ως αληθινό ή ψευδές.

Οι λογικοί τελεστές της Perl περιλαμβάνουν τους εξής:


- || λογικό Ή
- && λογικό ΚΑΙ

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


- ! λογική άρνηση ()
-
-: λειτουργία υπό όρους
- , διαδοχική εκτέλεση

Ο τελεστής λογικής άρνησης (!) αντικαθιστά την τιμή μιας Boolean τιμής με την αντίθετη τιμή της. Όπως και στο C, η Perl έχει έναν τελεστή υπό όρους (
-:) χρησιμοποιεί τρεις τελεστές. Μια έκφραση που χρησιμοποιεί τελεστή υπό όρους έχει την ακόλουθη μορφή:

Κατάσταση
- true-result: false-rezult

Ομοίως, η ακόλουθη έκφραση χρησιμοποιεί έναν τελεστή υπό όρους για να δώσει στον Bob πλήρη πρόσβαση και σε όλους τους άλλους περιορισμένη πρόσβαση:

$access = ($user eq "Bob"
- "Full" : "Limited");

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

Για ($i=0, $j=10; $i<10; $i++, $j-) { print i$," ",$j }

ΧΕΙΡΙΣΤΕΣ ΧΟΡΔΩΝ

Δεδομένου ότι η Perl είναι μια γλώσσα επεξεργασίας κειμένου, δεν προκαλεί έκπληξη το γεγονός ότι περιλαμβάνει πρόσθετους τελεστές για το χειρισμό συμβολοσειρών. Οι παρακάτω είναι οι τελεστές επεξεργασίας συμβολοσειρών:
-. συνένωση χορδών
- x αντιγραφή
- =~ αντιστοίχιση μεταβλητών προτύπων
- !~ το ίδιο με το προηγούμενο, αλλά με την προστιθέμενη άρνηση του αποτελέσματος

Οι δύο πρώτες δηλώσεις επεξηγούνται εύκολα με ένα παράδειγμα:

Εκτύπωση "β". "an" x 2 . "ένα"; # θα τυπώσει "μπανάνα"

Όπως φαίνεται, αυτή η έκφραση χρησιμοποιεί τη συνένωση συμβολοσειρών και τον τελεστή αναπαραγωγής για την εκτύπωση της συμβολοσειράς .Οι δύο τελευταίοι τελεστές χρησιμοποιούνται για να ελέγξουν εάν ένας τελεστής συμβολοσειράς περιλαμβάνει ένα δεδομένο μοτίβο. Αυτό το θέμα συζητείται λεπτομερώς στην ενότητα<Регулярные выражения>. Το ακόλουθο παράδειγμα επεξηγεί τη χρήση τους:

$var = "μπανάνα"; εκτύπωση ($var =~ /ana/)
- ΣΩΣΤΟ ΛΑΘΟΣ;

Σε αυτήν την περίπτωση, ο τελεστής δοκιμής εμφάνισης συμβολοσειράς μοτίβου (=~) χρησιμοποιήθηκε για να ελέγξει εάν το μοτίβο ana βρίσκεται στη μεταβλητή $var. Σε αυτήν την περίπτωση, η έκφραση παίρνει την τιμή<истинно>.

ΧΕΙΡΙΣΤΕΣ ΑΝΑΘΕΣΗ

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

= += -= *= /= %= |= &= ^= ~= <<= >>= **= .= x=

LVALUES Στο Perl, όπως και στο C, μια lvalue είναι το όνομα αυτού που εμφανίζεται στην αριστερή πλευρά του τελεστή εκχώρησης. Έτσι, μια τιμή lvalue αντιπροσωπεύει μια οντότητα στην οποία μπορεί να εκχωρηθεί μια τιμή, για παράδειγμα, μια τιμή lvalue μπορεί να είναι μια μεταβλητή. Για παράδειγμα, ένα σενάριο Perl δεν μπορεί να εκχωρήσει μια τιμή σε μια συμβολοσειρά χαρακτήρων, όπως η έκφραση = 32 γιατί δεν είναι μια τιμή. Ωστόσο, το σενάριο θα μπορούσε να εκχωρήσει μια τιμή στο $Bob, όπως $Bob = 32, καθώς το $Bob είναι μια τιμή lvalue. Στην Perl, οποιαδήποτε οντότητα μπορεί να χρησιμοποιηθεί ως τιμή lvalue συνήθως είναι. Για παράδειγμα, η ακόλουθη έκφραση συσκευάζει και αποσυσκευάζει μια λίστα τιμών, με τη λίστα των μεταβλητών στην πρώτη περίπτωση και τρεις βαθμωτές στη δεύτερη να είναι lvalues:

@color = ($r, $g, $b); # πακέτο χρωμάτων ($r, $g, $b) = @color; # έγχρωμη αποσυσκευασία

Όταν εργάζεστε με λίστες στο Perl, ο τελεστής εκχώρησης δεν ισχύει απαραίτητα για ολόκληρη τη λίστα. Το σενάριο μπορεί να εκχωρήσει τιμές σε μεμονωμένα στοιχεία λίστας, όπως φαίνεται παρακάτω:

@items = (100.200.300);

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

($arg1,$arg2,@rest) = @ARGV; # μπορείτε να αναμίξετε βαθμωτές και πίνακες

ΠΡΑΞΕΙΣ ΓΙΑ ΕΡΓΑΣΙΑ ΜΕ ΛΙΣΤΕΣ

Οι λειτουργίες για εργασία με λίστες περιλαμβάνουν τα ακόλουθα:

Κατασκευαστής λίστας - .. τελεστής εμβέλειας - x τελεστής αναπαραγωγής

Έχετε ήδη χρησιμοποιήσει τον κατασκευαστή λίστας για να αρχικοποιήσετε πίνακες και να δημιουργήσετε μια λίστα μεταβλητών που χρησιμοποιούνται ως lvalues. Ο τελεστής περιοχής επιστρέφει ως τιμή μια ακολουθία ακεραίων που ξεκινά από τον αριστερό τελεστή και συνεχίζει μέχρι και συμπεριλαμβανομένου του δεξιού τελεστή. Τα σενάρια χρησιμοποιούν συχνά τον τελεστή εμβέλειας σε συνδυασμό με έναν κατασκευαστή λίστας για τη δημιουργία λιστών. Για παράδειγμα, η ακόλουθη έκφραση χρησιμοποιεί τον τελεστή scope για να δημιουργήσει μια λίστα που ονομάζεται @digits που περιέχει τους αριθμούς από το μηδέν έως το εννέα:

@ψηφία = 0..9; # λίστα (1,2,3,4,5,6,7,8,9)

Ομοίως, αυτή η έκφραση μπορεί να χρησιμοποιήσει τον τελεστή εμβέλειας για να δημιουργήσει ένα εύρος αλλαγών σε δείκτες πίνακα. Ας υποθέσουμε ότι η λίστα @days περιέχει τις ημέρες της εβδομάδας (ξεκινώντας από την Κυριακή). Η ακόλουθη έκφραση εκχωρεί τις τιμές της λίστας @weekdays από Δευτέρα έως Παρασκευή:

@weekend = @days;

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

@hex_digits = (0..9,a..f);

Ο τελεστής αναπαραγωγής απλώς δημιουργεί αντίγραφα ενός δεδομένου τελεστή τον καθορισμένο αριθμό φορών. Για παράδειγμα, η ακόλουθη έκφραση επαναλαμβάνει τη λίστα με τις τιμές 1, 2, 3 τρεις φορές:

ΧΕΙΡΙΣΤΕΣ ΓΙΑ ΕΡΓΑΣΙΑ ΜΕ ΑΡΧΕΙΑ

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

Το D ελέγχει την ύπαρξη καταλόγου
--e καθορίζει την παρουσία ενός αρχείου
Το --s καθορίζει το μέγεθος αρχείου
Το --w καθορίζει εάν το δεδομένο αρχείο μπορεί να εγγραφεί

Οι επόμενοι δύο τελεστές αρχείων επιστρέφουν μια τιμή boolean Ο τρίτος τελεστής επιστρέφει το μέγεθος αρχείου σε byte. Το ακόλουθο κείμενο επεξηγεί τη χρήση αυτών των τελεστών:

Εάν (-e,"perl.exe") ( εκτύπωση "Μέγεθος αρχείου είναι:" -s "perl.exe"; ) else (εκτύπωση "δεν μπορώ να βρω το perl.exe\n"; ) (-w "SomeFile ") || die "Δεν μπορώ να γράψω στο SomeFile\n";

ΠΡΟΤΕΡΑΙΟΤΗΤΕΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΧΕΙΡΙΣΤΗ

Όπως κάθε γλώσσα προγραμματισμού, η Perl καθορίζει τις προτεραιότητες εκτέλεσης των χειριστών, με τη βοήθεια των οποίων διατάσσεται η ακολουθία της εκτέλεσής τους. Ο Πίνακας 12.2 παραθέτει τις προτεραιότητες του χειριστή από την υψηλότερη προς τη χαμηλότερη:


- ++
- ! ~ ενιαίο μείον
- **
- =~ !~
- * / % Χ
- +
- <<>>
- -d -e -s -w (και άλλοι τελεστές αρχείων)
- <> <= >= Γτ λε γε
- = = != < =>eq ne cmp
- &
- |^
- &&
- ||
- ..
-
- : = += -= *=

Τραπέζι 12.2. Προτεραιότητα τελεστή Perl από το υψηλότερο στο χαμηλότερο

Στο σενάριο σας, μπορείτε να αλλάξετε τη σειρά με την οποία εκτελούνται οι εντολές χρησιμοποιώντας παρενθέσεις.

PERL CONSTRUCTS

Η Perl υποστηρίζει όλες τις εκφράσεις C χρησιμοποιώντας σχεδόν την ίδια μορφή. Για παράδειγμα, ο έλεγχος κατασκευάζει if, while, do. Το for και το goto χρησιμοποιούνται με την ίδια μορφή και στις δύο γλώσσες. Όπως θα δείτε αργότερα, η δήλωση συνέχειας έχει ελαφρώς διαφορετική σημασία στο Perl. Η προηγούμενη τιμή του ονομάζεται τώρα επόμενο, και η εντολή break ονομάζεται τώρα τελευταία. Η Perl δεν εφαρμόζει μια δήλωση διακόπτη. Επιπλέον, ορισμένες εκφράσεις της γλώσσας C μπορούν να βρεθούν στο Perl σε άλλες μορφές και έχουν προστεθεί πολλές νέες εκφράσεις.

ΑΠΛΟΙ ΚΑΙ ΣΥΝΘΕΤΟΙ ΧΕΙΡΙΣΤΕΣ

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

$Title = "Προγραμματισμός Ιστού"; !}

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

(#Operators#Another operator block)

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

ΣΥΝΘΗΚΟΙ ΧΕΙΡΙΣΤΕΣ

Πολλά από τα προηγούμενα παραδείγματα χρησιμοποιούσαν τη δήλωση if. Στην Perl, η πρόταση if είναι σχεδόν πανομοιότυπη με τη δήλωση if στο C. Η διαφορά, ωστόσο, είναι ότι στο C, η εντολή if μπορεί να χρησιμοποιήσει μια απλή πρόταση χωρίς σγουρά άγκιστρα, ενώ στην Perl, οι εντολές πρέπει να περικλείονται σε σγουρές αγκύλες, σχηματίζοντας ένα μπλοκ.

Αν (expr) δήλωση? // αποδεκτό για C αλλά όχι για Perl if (expr) (δήλωση; # έτσι πρέπει να το κάνετε στο Perl)

Ομοίως, η εντολή else του Perl λειτουργεί ελαφρώς διαφορετικά από την αντίστοιχη δήλωση στο C. Στο Perl, οι εντολές πρέπει επίσης να περικλείονται σε σγουρά άγκιστρα και να σχηματίζουν ένα μπλοκ:

// Το παράδειγμα στο C δεν είναι αποδεκτό στο Perl εάν (expr1) statament1; αλλιώς if (expr2) statement2; αλλο ststement3?

Τα παρακάτω δείχνουν ότι η Perl σας επιτρέπει να χρησιμοποιήσετε την κατασκευή elif:

Αν (expr1) (statament1; ) elsif (expr2) ( statement2; ) else (ststement3; )

ΧΕΙΡΙΣΤΗΣ ΕΚΤΟΣ ΑΝ

Στη γλώσσα προγραμματισμού C, οι προγραμματιστές χρησιμοποιούν τη λογική άρνηση (!) για να αντιστρέψουν μια τιμή Boolean, όπως φαίνεται παρακάτω:

Αν (!(expr)) // Άρνηση στο C ( δήλωση; )

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

Εκτός εάν (expr) (δήλωση; )

Σημείωση: Σε αντίθεση με το C, η Perl δεν περιέχει δήλωση διακόπτη.

DO ΧΕΙΡΙΣΤΗΣ

Μια ειδική περίπτωση τελεστών μπλοκ είναι ο τελεστής do, ο οποίος επιτρέπει σε ένα μπλοκ εντολών να επιστρέφει τιμές. Η τιμή που επιστρέφει η δήλωση do είναι η τιμή της τελευταίας έκφρασης που αξιολογήθηκε εντός του μπλοκ. Για παράδειγμα, η ακόλουθη δήλωση do συγκρίνει τη μεταβλητή συμβολοσειράς $Month με τους μήνες του έτους και ορίζει τη μεταβλητή $DayCount στον αριθμό των ημερών του μήνα:

$DayCount = do ( if ($Month eq "September" || $Month eq "April" || $Month eq "June" || $Month eq "November") ( 30; ) elsif ($Month eq "February" ) ($Year & 3
- 28: 29; # Έλεγχος για δίσεκτο έτος ) else ( 31; ) );

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

ΚΥΚΛΟΙ ΚΑΙ ΚΛΑΔΙΑ

Η Perl υποστηρίζει τις εντολές βρόχου for, while και do με μικρές διαφορές από την υλοποίησή τους στο C. Η σημαντική διαφορά είναι ότι η Perl απαιτεί εντολές να χρησιμοποιούνται σε μπλοκ που περικλείονται σε σγουρά άγκιστρα. Επίσης, όπως θα δείτε, η Perl επεκτείνει την κατασκευή βρόχου για να παρέχει μερικές νέες φόρμες. Στα ακόλουθα παραδείγματα, οι βρόχοι for, while και do λειτουργούν παρόμοια σε C και Perl:

Για($i = 0; $i< 100;$i++) { printf("%d\n", $i) ; } while ($i >0) ( printf("%d\n", $i-); ) do ( printf("%d\n", $i++); ) ενώ ($i< 0);

Ο σχεδιασμός των βρόχων στο C είναι επίσης διαφορετικός από αυτόν του Perl, καθώς το Perl δεν περιέχει μια εντολή break και η εντολή continue εκτελεί μια εντελώς διαφορετική λειτουργία. Ευτυχώς, η Perlo παρέχει μερικές νέες, πιο ευέλικτες και πιο διαισθητικές κατασκευές:


- τελευταία έξοδος από τον βρόχο (όπως ο τελεστής διακοπής C)
- επόμενη έναρξη μιας νέας επανάληψης (όπως η δήλωση C συνέχεια)
- επαναλάβετε την τρέχουσα επανάληψη

Για να κατανοήσετε τις κατασκευές βρόχων στην Perl, πρέπει να κατανοήσετε τη χρήση του μπλοκ συνέχειας. Εξετάστε τον ακόλουθο βρόχο while, ο οποίος περιέχει ένα μπλοκ συνέχειας:

$i = 100; ενώ ($i > 0) ( εκτύπωση $i; ) συνέχεια ($i-)

Μπορείτε να σκεφτείτε ένα μπλοκ συνέχειας ως την τρίτη έκφραση σε έναν βρόχο for που εκτελείται κάθε επανάληψη. Ομοίως, η Perl εκτελεί ένα μπλοκ συνέχειας στο τέλος κάθε επανάληψης. Ωστόσο, όπως θα μάθετε αργότερα, το μπλοκ συνέχεια δίνει στο σενάριο περισσότερο έλεγχο της διαδικασίας από ό,τι παρέχει ένας βρόχος for. Όταν ένας βρόχος Perl χρησιμοποιεί μια επόμενη πρόταση, το μπλοκ συνέχισης εξακολουθεί να εκτελείται εάν υπάρχει. Ωστόσο, εάν ο βρόχος χρησιμοποιεί μια δήλωση επανάληψης, το μπλοκ συνεχίζει δεν εκτελείται.

ΕΤΙΚΕΤΕΣ

Σε ένα σενάριο Perl, οι ετικέτες σημαίνουν απλώς ένα όνομα που αντιστοιχεί σε κάποια θέση μέσα στο σενάριο. Τα ονόματα των ετικετών τελειώνουν με άνω και κάτω τελεία (για παράδειγμα, outerloop :). Χρησιμοποιώντας τη δήλωση goto, το σενάριο μπορεί να μεταβεί σε μια ετικέτα. Επιπλέον, οι τελεστές τελευταίος, επόμενος και επανάληψη μπορούν να χρησιμοποιηθούν για μετάβαση σε μια ετικέτα. Ο ακόλουθος κώδικας απεικονίζει τη χρήση του τελευταίου τελεστή για μετάβαση σε μια ετικέτα:

Outerloop: while ($i > 0) ( while ($j > 0) ( #Κάποια άλλη διαδικασία εδώ εάν ($needToAboutLoop) ( τελευταίος εξωτερικός βρόχος; ) ) )

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

ΜΕΧΡΙ LOOP

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

Ενώ (!(expr)) (δήλωση; )

Χρησιμοποιώντας έναν βρόχο μέχρι, μπορείτε να δημιουργήσετε έναν ίδιο βρόχο που φαίνεται παρακάτω:

Μέχρι (expr) (δήλωση; )

Ομοίως, η ακόλουθη πρόταση do while χρησιμοποιεί τον τελεστή λογικής άρνησης για να κάνει βρόχο μέχρι μια δεδομένη Boolean έκφραση να αξιολογηθεί ως true:

Do ( statement; ) while (!(expr));

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

Do ( δήλωση; ) μέχρι (expr);

ΓΙΑ ΚΑΙ FOREACH ΚΥΚΛΟΥΣ

Η Perl υποστηρίζει βρόχους με πολύ παρόμοιο τρόπο με το C:

Για (δήλωση 1, έκφραση, δήλωση 2) ​​( δήλωση 3; )

Για παράδειγμα, ο ακόλουθος κώδικας χρησιμοποιεί έναν βρόχο for για να εκτυπώσει τις τιμές των αριθμών από το 0 έως το 100:

Για ($ψηφίο = 0; $ψηφίο<=100; $digit++) { print $digit, " "; }

Επιπλέον, η Perl περιλαμβάνει μια κατασκευή βρόχου foreach που επιτρέπει σε ένα σενάριο να επαναλαμβάνεται πάνω από λίστες και πίνακες. Ας δούμε ένα παράδειγμα:

@list = ("a","b","c"); foreach $arg (@list) ( εκτύπωση "Στοιχείο λίστας: $arg\n"; ) foreach $i (1..10) (εκτύπωση "επανατροπή $i\n" )

Στην πρώτη περίπτωση, ο βρόχος foreach επαναλήφθηκε μέσω των τιμών της μεταβλητής @list. Στο δεύτερο παράδειγμα, ο βρόχος foreach επαναλαμβάνεται σε αριθμούς στην περιοχή από 1 έως 10. Ο βρόχος foreach μπορεί να περιέχει μια λίστα με κυριολεκτικά ή έναν πίνακα, όπως απεικονίζεται στο προηγούμενο παράδειγμα. Μετά από μία επανάληψη του βρόχου, μια ειδική βαθμωτή μεταβλητή ($arg στην πρώτη περίπτωση και $i στη δεύτερη περίπτωση) παίρνει μια τιμή από τη δεδομένη λίστα στοιχείων. Το εύρος αυτής της βαθμωτής μεταβλητής σε έναν βρόχο foreach περιορίζεται στο σώμα του βρόχου. Επομένως, μια μεταβλητή βαθμωτής βρόχου, foreach, δεν θα έρχεται σε σύγκρουση με ένα πανομοιότυπο όνομα μεταβλητής που ορίζεται εκτός του βρόχου. Ο παρακάτω κώδικας χρησιμοποιεί μια μεταβλητή με το όνομα $i εντός και εκτός ενός βρόχου foreach:

$i = 1001; foreach $i (1..9) ( εκτύπωση "$i\n"; # loop θα εκτυπώσει 123456789 ) εκτύπωση "$i\n";

Όπως μπορείτε να δείτε από αυτό το παράδειγμα, η μεταβλητή $i που χρησιμοποιείται για την οργάνωση των επαναλήψεων βρόχου δεν έρχεται σε διένεξη με τη μεταβλητή $i που ορίζεται εκτός του βρόχου. Ένα χαρακτηριστικό του βρόχου foreach που μπορούν να εκμεταλλευτούν τα σενάρια σας είναι η δυνατότητα τροποποίησης στοιχείων πίνακα. (Προσοχή όταν εφαρμόζετε αυτήν τη δυνατότητα!) Εξετάστε τον ακόλουθο βρόχο foreach, ο οποίος προσθέτει την τιμή 10 σε κάθε στοιχείο πίνακα:

@list = 1..5; foreach $i (@list) ( $i += 10; ) $, = " "; εκτύπωση @list; Το # θα δώσει έξοδο 11 12 13 14 15

Ας κάνουμε μερικές τελευταίες σημειώσεις για τον βρόχο foreach. Η Perl αντιμετωπίζει τα ονόματα foreach και for ως συνώνυμα. Επομένως, μπορείτε να χρησιμοποιήσετε αυτά τα ονόματα εναλλακτικά σε σενάρια. Η Perl, με τη σειρά της, θα καθορίσει τον τύπο του βρόχου με βάση το περιβάλλον του.

ΑΝΩ ​​ΟΡΟΥΣ ΧΕΙΡΙΣΤΗΣ ΕΡΓΑΣΙΑΣ GOTO

Η Perl υποστηρίζει τον τελεστή goto, ο οποίος είναι πανομοιότυπος με τον τελεστή της γλώσσας προγραμματισμού C. Ακολουθεί ένα παράδειγμα χρήσης του τελεστή goto για την εκτύπωση αριθμών από το 1 έως το 10:

$i = 1; βρόχος: εκτύπωση $i++, " "; εάν ($i<=10) { goto loop; }

ΤΡΟΠΟΠΟΙΗΤΕΣ ΧΕΙΡΙΣΤΗ

Η Perl χρησιμοποιεί ειδικές μορφές των δομών if, unless, while, και μέχρι για να ελέγξει την πρόοδο των υπολογισμών. Σε ορισμένες περιπτώσεις, αυτές οι ειδικές κατασκευές μπορούν να κάνουν τον κώδικά σας πιο σαφή και πιο ευανάγνωστο. Για να γίνει ο κώδικας πιο ευανάγνωστος και το νόημά του πιο εμφανές, καλό είναι να επιλέξετε μια κατάλληλη μορφή για εγγραφή. Εξετάστε μια έκφραση ρολογιού που χρησιμοποιεί τη συνάρτηση die για να τερματίσει το σενάριο εάν η τιμή της μεταβλητής $count είναι μικρότερη από 10:

Εάν ($count< 10) { die; }

Τοποθετώντας τη συνάρτηση die πριν από την εντολή if, όπως φαίνεται παρακάτω, ο αριθμός των γραμμών κώδικα θα μειωθεί:

Πέθανε αν ($count< 10);

Ομοίως, η ίδια έκφραση μπορεί να γραφτεί ως εξής:

($count >= 10) || καλούπι;

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

Πέθανε εκτός και αν ($count >= 10);

Ομοίως, οι ακόλουθοι βρόχοι while είναι πανομοιότυποι:

$i = 0; ενώ ($i< 10) { $i++; } $i = 0; $i++ while ($i < 10);

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

$i = 10; μέχρι ($i >= 10) ( $i++; ); $i = 10; $i++ έως ($i >=10);

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

ΔΗΜΙΟΥΡΓΙΑ ΔΥΝΑΜΙΚΩΝ ΕΚΦΡΑΣΕΩΝ ΜΕ ΧΡΗΣΗ ΤΗΣ ΣΥΝΑΡΤΗΣΗΣ EVAL

Επειδή η Perl είναι μια διερμηνευμένη γλώσσα, τα σενάρια σας μπορούν να χρησιμοποιούν την Perl για τη δημιουργία κώδικα<налету>, δηλαδή δυναμικά κατά την εκτέλεση του σεναρίου. Αυτός είναι ακριβώς ο τρόπος με τον οποίο λειτουργεί το πρόγραμμα εντοπισμού σφαλμάτων Perl (το οποίο είναι ένα πρόγραμμα Perl που ονομάζεται Perldb.PL). Όταν σχεδιάζετε σενάρια, μπορείτε να χρησιμοποιήσετε τέτοιο δυναμικό κώδικα για να δημιουργήσετε δυναμικές μεταβλητές ή ακόμα και να δημιουργήσετε ειδικές ρουτίνες. Η Perl αξιολογεί δυναμικές εκφράσεις χρησιμοποιώντας τη συνάρτηση eval. Το παρακάτω παράδειγμα δημιουργεί μια δυναμική εντολή εκχωρώντας την τιμή μιας μεταβλητής σε κείμενο, το οποίο στην πραγματικότητα περιέχει την απαιτούμενη εντολή Perl. Περαιτέρω οδηγίες χρησιμοποιούν τη συνάρτηση eval για να εκτελέσετε αυτήν την εντολή:

$perl_statement = "εκτύπωση "Γεια, κόσμο\n";"; ισοτιμία $perl_statement; Το # θα εκτυπώσει Hello, world $i = 1001; $varname = "$i"; τιμή εκτύπωσης $varname; Το # θα εκτυπώσει την τιμή του $i

Σημείωση: Υπάρχουν κίνδυνοι από τη χρήση της συνάρτησης eval σε μια δέσμη ενεργειών, ειδικά εάν η δέσμη ενεργειών μεταβιβάζει δεδομένα που παρέχονται από το χρήστη στη λειτουργία eval. Χρησιμοποιώντας τη συνάρτηση eval, ένα σενάριο μπορεί να εκτελέσει μια αυθαίρετη εντολή Perl, συμπεριλαμβανομένων ακόμη και εντολών συστήματος. Αυτό δίνει στον χρήστη τον έλεγχο του προγράμματος, το οποίο μπορεί να είναι ιδιαίτερα επικίνδυνο στο Διαδίκτυο και στον Ιστό.

ΥΠΟΡΟΥΤΙΝΕΣ

Όπως όλες οι δομημένες γλώσσες προγραμματισμού, η Perl υποστηρίζει ρουτίνες. Μια υπορουτίνα μπορεί να οριστεί χρησιμοποιώντας τη δευτερεύουσα λέξη-κλειδί όπως φαίνεται παρακάτω:

Sub demo_sub ( εκτύπωση "demo_sub call\n"; ) &demo_sub; # κλήση υπορουτίνας

Σε αυτήν την περίπτωση, οι οδηγίες σχηματίζουν μια υπορουτίνα που ονομάζεται demo_sub. Για να καλέσετε μια υπορουτίνα, το σενάριο τοποθετεί ένα σύμφωνο (&) μπροστά από το όνομα της υπορουτίνας. Όταν καλείτε μια υπορουτίνα στο Perl, οι παρενθέσεις μπορούν να παραληφθούν. Μπορείτε να τοποθετήσετε τη ρουτίνα οπουδήποτε μέσα στον πηγαίο κώδικα του σεναρίου, επειδή η Perl θα αναλύσει όλο τον πηγαίο κώδικα πριν από την εκτέλεση του σεναρίου. Μπορείτε να δηλώσετε μια υπορουτίνα στον πηγαίο κώδικα αμέσως μετά την πρώτη χρήση της υπορουτίνας (προώθηση αναφοράς). Οι υπορουτίνες μπορούν να έχουν ορίσματα και να επιστρέφουν τιμές. Το ακόλουθο απόσπασμα κώδικα περιέχει μια ρουτίνα που ονομάζεται show_value που εκτυπώνει την τιμή που λαμβάνει η ρουτίνα ως παράμετρο:

Sub show_value ( εκτύπωση "The value id ", $_; ) &show_value(1001);

Επίσημα, μια ρουτίνα Perl δεν δηλώνει μεταβλητές για την αποθήκευση ορισμάτων. Αντίθετα, μια μεταβλητή πίνακα με το όνομα @_ μεταβιβάζεται στη ρουτίνα, η οποία περιέχει τις τιμές των παραμέτρων. Με τη σειρά της, η ρουτίνα έχει πρόσβαση στις τιμές των ορισμάτων χρησιμοποιώντας την ακόλουθη σημείωση για στοιχεία πίνακα: $_, $_, κ.λπ. Ωστόσο, αυτή η μέθοδος μεταβίβασης παραμέτρων μπορεί να βλάψει την αναγνωσιμότητα του κώδικα και επομένως οι περισσότερες ρουτίνες χρησιμοποιούν αντιγραφή ορισμάτων σε τοπικές μεταβλητές. Παρόμοια με το προηγούμενο παράδειγμα, η ακόλουθη ρουτίνα show_fwo_values ​​εμφανίζει τις τιμές δύο παραμέτρων:

Sub show_two_values ​​(εκτύπωση "Πρώτη παράμετρος", $_, "\n"; εκτύπωση "Δεύτερη παράμετρος", $_, "\n"; ) &show_two_values(1001, 2002);

Τέλος, η επόμενη συνάρτηση, show_all_values, εκτυπώνει τις τιμές όλων των παραμέτρων που λαμβάνει. Η συνάρτηση χρησιμοποιεί έναν πίνακα για να ορίσει έναν αριθμό ως παράμετρο:

Sub show_all_values ​​(για ($i = 0; $i< @_; $i++) { print "Parametr ", $i, " is ", $_[$i], "\n"; } } & show_all_values(1001,2002,3003,4004);

Όπως αναφέρθηκε, οι ρουτίνες Perl μπορούν να επιστρέψουν τιμές. Η δήλωση επιστροφής χρησιμοποιείται για αυτό. Σε αντίθεση με τη γλώσσα C, η Perl δεν απαιτεί τη χρήση μιας δήλωσης επιστροφής. Εάν η ρουτίνα δεν περιέχει δήλωση επιστροφής, τότε η τελευταία αξιολογηθείσα έκφραση θα ληφθεί ως τιμή επιστροφής. Το ακόλουθο παράδειγμα προσθέτει δύο παραμέτρους και επιστρέφει το αποτέλεσμα:

Sub add_values  ( return $_ + $_; ) print "The result is: ", &add_values(1001,2002);

ΒΙΒΛΙΟΘΗΚΗ ΥΠΟΡΟΥΤΙΝΩΝ

Σε αντίθεση με το C, η Perl δεν υποστηρίζει στην πραγματικότητα την έννοια της βιβλιοθήκης. Ωστόσο, έχει έναν μηχανισμό που επιτρέπει στα σενάρια να χρησιμοποιούν πηγαίο κώδικα από άλλο αρχείο. Για παράδειγμα, ας υποθέσουμε ότι αποθηκεύετε τη ρουτίνα add_valuesl σε ένα αρχείο που ονομάζεται addvalue.pl. Χρησιμοποιώντας τη δήλωση ζήτησης, ένα άλλο σενάριο Perl μπορεί να έχει πρόσβαση σε αυτήν τη ρουτίνα, όπως φαίνεται παρακάτω:

Απαιτείται "addvalue.pl"; print &add_values(10,11);

Μπορείτε να σκεφτείτε τη δήλωση ζήτησης ως ανάλογη με την πρόταση #include του προεπεξεργαστή C. Για να βρείτε ένα αρχείο προέλευσης, η Perl αναζητά πρώτα στον προεπιλεγμένο κατάλογο για τη βιβλιοθήκη Perl (δείτε τις οδηγίες εγκατάστασης για λεπτομέρειες) και μετά στον τρέχοντα κατάλογο. Μπορείτε επίσης να χρησιμοποιήσετε μια απόλυτη ή σχετική διαδρομή που επισυνάπτεται με το όνομα του αρχείου. Η Perl θυμάται ποια αρχεία ζητήθηκαν από τη δήλωση απαίτησης και τα φορτώνει μόνο μία φορά, ακόμα κι αν αυτά τα αρχεία έχουν πρόσβαση πολλές φορές. Υπάρχουν πολλές τυπικές βιβλιοθήκες που επεκτείνουν τις δυνατότητες της γλώσσας Perl. Τώρα είναι η κατάλληλη στιγμή να περιπλανηθείτε στον κατάλογο όπου είναι αποθηκευμένα τα αρχεία της βιβλιοθήκης Perl για να πάρετε μια ιδέα για τις δυνατότητες που προσφέρουν.

ΧΡΗΣΗ ΠΑΚΕΤΩΝ ΓΙΑ ΑΠΟΜΟΝΩΣΗ ΥΠΟΡΟΥΤΙΝΩΝ

Εάν έχετε πολλές ρουτίνες, ειδικά τις ρουτίνες που αποθηκεύετε σε διαφορετικά αρχεία, ενδέχεται να προκύψουν συγκρούσεις ονομάτων μεταβλητών όταν χρησιμοποιείται το ίδιο όνομα μεταβλητής για διαφορετικούς σκοπούς. Η Perl βοηθά να αποφευχθεί αυτό με πακέτα. Όπως γνωρίζετε, δηλώνοντας τοπικές μεταβλητές για υπορουτίνες, μπορείτε να αποφύγετε τις συγκρούσεις ονομάτων. Ωστόσο, εάν πολλές ρουτίνες μοιράζονται συγκεκριμένα δεδομένα, αυτά τα δεδομένα ενδέχεται να απαιτούν ένα καθολικό εύρος, το οποίο μπορεί να οδηγήσει σε συγκρούσεις ονομάτων. Χρησιμοποιώντας πακέτα, μπορείτε να ομαδοποιήσετε καθολικά δεδομένα σε ιδιωτικούς χώρους ονομάτων, εκτός των οποίων οι καθολικές μεταβλητές δεν είναι ορατές, δηλαδή άγνωστες . Εξετάστε το απλό παράδειγμα παρακάτω, στο οποίο δύο ρουτίνες (που βρίσκονται σε διαφορετικά αρχεία) χρησιμοποιούν ιδιωτικούς, μεμονωμένους χώρους ονομάτων.

# Κωδικός στο αρχείο one.pl sub_one ( πακέτο επίδειξης_one; $some_data = 10; ) # * * * * * * * * * # Κωδικός στο αρχείο two.pl sub_one (πακέτο demo_two; $some_data = 20; )

Όπως μπορείτε να δείτε, η πρώτη ρουτίνα χρησιμοποιεί το όνομα πακέτου demo_one, η δεύτερη ρουτίνα χρησιμοποιεί το όνομα πακέτου demo_two. Και οι δύο ρουτίνες μπορούν να ορίσουν και να χρησιμοποιήσουν τη μεταβλητή $some_data χωρίς να προκαλέσουν σύγκρουση ονόματος μεταξύ της μιας καθολικής μεταβλητής και της άλλης. Γραφή<знает>το όνομα του πακέτου εντός του οποίου βρίσκεται η μεταβλητή και οργανώνει την πρόσβαση σε αυτό, χρησιμοποιεί το όνομα του πακέτου ως πρόθεμα στο όνομα της μεταβλητής. Το ακόλουθο παράδειγμα προσθέτει το όνομα πακέτου package_one ή package_two ως πρόθεμα στο όνομα της μεταβλητής some_data:

&sub_one; &sub_two; εκτύπωση "Μεταβλητή 1 $package_one"some_data\n" εκτύπωση "Μεταβλητή 2 $package_two"some_data\n"

Όταν χρησιμοποιείτε πακέτα Perl, μπορείτε να δημιουργήσετε έναν μοναδικό χώρο ονομάτων μέσα στο τρέχον αρχείο προέλευσης τοποθετώντας μια δήλωση πακέτου στην αρχή του αρχείου, όπως φαίνεται παρακάτω:

Πακέτο some_package_name $some_data = 1; sub some_sub (επιστροφή $some_data; )

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

Απαιτείται "some_package.pl"; εκτύπωση &some_package_name"some_sub;

ΕΠΕΞΕΡΓΑΣΙΑ ΣΕΙΡΩΝ

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

ΛΕΙΤΟΥΡΓΙΑ ΚΟΠ

Η συνάρτηση κοπής αφαιρεί τον τελευταίο χαρακτήρα μιας συμβολοσειράς. Έχει την εξής μορφή:

$character = chop(Str);

Η συνάρτηση κοπής επιστρέφει τον αφαιρεμένο χαρακτήρα. Τα σενάρια Perl κάνουν εκτενή χρήση του chop για την αφαίρεση χαρακτήρων νέας γραμμής και τέλους γραμμής.

ΣΥΝΑΡΤΗΣΗ ΕΥΡΕΤΗΡΙΟΥ

Η συνάρτηση ευρετηρίου αναζητά μια δεδομένη υποσυμβολοσειρά σε μια συμβολοσειρά. Έχει την εξής μορφή:

$location = index(Str, SubStr[, Offset]);

Η συνάρτηση ευρετηρίου επιστρέφει τον δείκτη της πρώτης εμφάνισης μιας υποσυμβολοσειράς (SubStr) σε μια συμβολοσειρά (Str). Μπορεί προαιρετικά να καθοριστεί μια μετατόπιση μετά την οποία αρχίζει η αναζήτηση. Εάν βρεθεί η υποσυμβολοσειρά, επιστρέφεται η τιμή -1. Στο ακόλουθο παράδειγμα, η συνάρτηση ευρετηρίου αναζητά εμφανίσεις της υποσυμβολοσειράς "na" μετά τον τρίτο χαρακτήρα στη συμβολοσειρά "banana":

Ευρετήριο εκτύπωσης("μπανάνα","na",3); # Εκτυπώσεις 4.

ΛΕΙΤΟΥΡΓΙΑ RINDEX

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

$location = rindex(Str, SubStr);

Αυτή η συνάρτηση είναι παρόμοια με τη συνάρτηση ευρετηρίου, με τη διαφορά ότι επιστρέφει την τελευταία εμφάνιση και όχι την πρώτη. Για παράδειγμα, το ακόλουθο παράδειγμα χρησιμοποιεί τη συνάρτηση rindex για να προσδιορίσει την τελευταία εμφάνιση της υποσυμβολοσειράς "na" στη συμβολοσειρά "banana":

Εκτύπωση rindex("banana","na"); # Εκτυπώσεις 4

ΛΕΙΤΟΥΡΓΙΑ ΜΗΚΟΥΣ

Η συνάρτηση μήκος επιστρέφει τον αριθμό των χαρακτήρων σε μια συμβολοσειρά. Έχει την εξής μορφή:

$len = μήκος(Str);

Το παρακάτω παράδειγμα χρησιμοποιεί τη συνάρτηση μήκος για να εκτυπώσει τον αριθμό των χαρακτήρων σε μια συμβολοσειρά:

Μήκος εκτύπωσης ("μπανάνα"); # Εκτυπώσεις 6

ΛΕΙΤΟΥΡΓΙΑ SUBSTR

Η συνάρτηση substr χρησιμοποιείται για την αφαίρεση μέρους μιας συμβολοσειράς. Έχει την εξής μορφή:

$substring = substr(Str, Offset[,Len]);

Η συνάρτηση επιστρέφει μια υποσυμβολοσειρά, δηλαδή ένα μέρος μιας συμβολοσειράς της οποίας το μήκος δεν υπερβαίνει την τιμή που καθορίζεται από την προαιρετική παράμετρο Len. Η επιστρεφόμενη υποσυμβολοσειρά του str ξεκινά από τον χαρακτήρα στη θέση που καθορίζεται από το Offset. Εάν η παράμετρος Len παραλειφθεί, τότε η συμβολοσειρά που επιστρέφεται περιέχει χαρακτήρες μέχρι και το τέλος της γραμμής. Εάν η παράμετρος Offset είναι αρνητική, τότε η μετατόπιση υπολογίζεται από το τέλος της γραμμής. Τέλος, το σενάριο μπορεί να χρησιμοποιήσει το substr ως lvalue για να εκτελέσει μια λειτουργία ανάθεσης. Το παρακάτω απόσπασμα κώδικα απεικονίζει τη χρήση της συνάρτησης substr.

Εκτύπωση substr("πορτοκαλί",3); #Outputs "nge" print substr("πορτοκαλί",-2); # Εκτυπώνει "ge" print substr("πορτοκαλί",2,2); # Εκτυπώνει "an" $str = "apple"; substr($str,-3) = "ρίκο"; εκτύπωση $str; # Εκτυπώνει "βερίκοκο"

Σημείωση: Η χρήση τελεστών τυπικής έκφρασης Perl είναι συχνά πιο αποτελεσματική από τη χρήση συναρτήσεων substr. Οι κανονικές εκφράσεις συζητούνται αργότερα σε αυτό το κεφάλαιο.

ΛΕΙΤΟΥΡΓΙΑ ΣΥΝΔΕΣΗΣ

Η συνάρτηση join ενώνει μια λίστα στοιχείων σε μια συμβολοσειρά, διαχωρίζοντας κάθε στοιχείο με έναν δεδομένο χαρακτήρα. Έχει την εξής μορφή:

$new_string = join(Str,List);

Η συνάρτηση join μετατρέπει κάθε στοιχείο μιας λίστας σε συμβολοσειρά και ενώνει τις συμβολοσειρές. Το ακόλουθο απόσπασμα κώδικα απεικονίζει τη χρήση της συνάρτησης ένωσης:

$str = join(",", 0..4,10,20); # Η λίστα θα είναι "0,1,2,3,4,10,20" $strn = join ("\t", $a, $b, $c);# Αναμιγνύει τις λίστες

ΔΙΑΧΩΡΙΣΜΕΝΗ ΛΕΙΤΟΥΡΓΙΑ

Η συνάρτηση split χωρίζει τα περιεχόμενα μιας συμβολοσειράς σε μια λίστα στοιχείων. Έχει την εξής μορφή:

Split(Delimeter, Str[,Limit]);

Το όρισμα Delimeter καθορίζει τον χαρακτήρα με τον οποίο θα διαχωριστεί, όπως κενό, λέξη, καρτέλα κ.λπ. ε. Η προαιρετική παράμετρος Limit καθορίζει τον μέγιστο αριθμό στοιχείων που μπορεί να περιέχει η λίστα. Το ακόλουθο παράδειγμα επεξηγεί τη χρήση της συνάρτησης split.

ΛΕΙΤΟΥΡΓΙΕΣ ΓΙΑ ΕΠΕΞΕΡΓΑΣΙΑ ΛΙΣΤΩΝ

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

ΑΝΤΙΣΤΡΟΦΗ ΛΕΙΤΟΥΡΓΙΑ

Η αντίστροφη συνάρτηση αντιστρέφει τα στοιχεία μιας λίστας. Έχει την εξής μορφή:

@new_list = reverse(@List);

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

@list = reverse(1..5); # Αποτέλεσμα 5,4,3,2,1 @list = reverse(@list); # Αποτέλεσμα 1,2,3,4,5

ΛΕΙΤΟΥΡΓΙΑ ΤΑΞΙΝΟΜΗΣΗΣ

Η συνάρτηση ταξινόμησης ταξινομεί τα στοιχεία μιας λίστας. Έχει την εξής μορφή:

@new_list = sort(@List);

@new_list = sort(Υπορουτίνα @List);

@new_list = sort(BlockStatement @List);

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

@list = sort(1,5,2,3,4); # Αποτέλεσμα 1,2,3,4,5 @list = sort(1,2,10); # 1,10,2 ταξινόμηση σε ASCII

Σε μια υπορουτίνα ή μπλοκ, μπορείτε να αλλάξετε τη σειρά με την οποία εκτελείται η ταξινόμηση. Το ακόλουθο παράδειγμα επεξηγεί τη χρήση της συνάρτησης ταξινόμησης.

@list = ταξινόμηση(($a<=>$b) (2,1,10)); # @list 1,2,10 @list = ταξινόμηση(($b<=>$a)) (2,1,10); # @list 10,2,1 sub mycomp ( $b<=>$a ) @list = sort(mycomp (2,1,10)); # @list 10,2,1

ΛΕΙΤΟΥΡΓΙΕΣ ΓΙΑ ΕΡΓΑΣΙΑ ΜΕ ΠΙΝΑΚΕΣ

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

ΛΕΙΤΟΥΡΓΙΕΣ PUSH ΚΑΙ POP

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

Push(@ARRAY, LIST);

Το ακόλουθο απόσπασμα επεξηγεί τη χρήση της συνάρτησης ώθησης:

@list = (); push(@list,10,20); Το # @list είναι τώρα (10,20) push(@list,1..3); Η # @list είναι τώρα (10,20,1,2,3)

Αντίθετα, η συνάρτηση pop αφαιρεί το στοιχείο που ωθήθηκε τελευταία στη στοίβα και επιστρέφει την τιμή αυτού του στοιχείου. Η συνάρτηση pop έχει την ακόλουθη μορφή:

$value = pop(@ARRAY);

Το ακόλουθο τμήμα προγράμματος απεικονίζει τη χρήση της συνάρτησης pop:

# Ας πάρουμε το @list από το προηγούμενο παράδειγμα print pop(@list); # Εκτύπωση 3 print pop(@list); # Εκτυπώσεις 2 # Τώρα @list (10,20)

ΛΕΙΤΟΥΡΓΙΑ SHIFT

Η συνάρτηση shift αφαιρεί και επιστρέφει ένα στοιχείο από την αρχή ενός πίνακα. Αυτή η συνάρτηση είναι παρόμοια με τη συνάρτηση pop με τη μόνη διαφορά ότι λειτουργεί από την αρχή του πίνακα σύμφωνα με την αρχή FIFO (<первым вошел, первым вышел>). Η συνάρτηση shift έχει την ακόλουθη μορφή:

$value = shift(@ARRAY);

Το ακόλουθο τμήμα προγράμματος επεξηγεί τη χρήση της συνάρτησης shift:

# Ας πάρουμε το @list από το προηγούμενο παράδειγμα

Εκτύπωση shift(@list); # Εκτύπωση 10 print shift(@list); # Εκτυπώσεις 20 # Τώρα @list()

ΛΕΙΤΟΥΡΓΙΑ UNSHIFT

Η συνάρτηση unshift προσθέτει ένα ή περισσότερα στοιχεία στην αρχή ενός πίνακα. Έχει τον παρακάτω κωδικό:

Unshift(@Array, List);

Το ακόλουθο τμήμα προγράμματος επεξηγεί τη χρήση της συνάρτησης unshift:

# @list = () unshift(@list,5,10,20); # @list (5,10,20) unshift(@list, 1..3); # @list (1,2,3,5,10,20)

ΛΕΙΤΟΥΡΓΙΑ ΣΥΝΔΕΣΗΣ

Τα σενάρια Perl χρησιμοποιούν τη συνάρτηση splice για να αφαιρέσουν στοιχεία από μια λίστα, αντικαθιστώντας τα με στοιχεία μιας άλλης λίστας. Έχει την εξής μορφή:

Splice(@Array, Offset[, Count[, List]]);

Η συνάρτηση splice αφαιρεί τον καθορισμένο αριθμό στοιχείων (Count) από έναν πίνακα (@Array), ξεκινώντας με το στοιχείο που δείχνει η τιμή μετατόπισης (Offset) και αντικαθιστά τα στοιχεία με στοιχεία μιας άλλης λίστας (List). Εάν η κλήση συνάρτησης δεν καθορίζει μια παράμετρο Count, η συνάρτηση ανακτά στοιχεία μέχρι το τέλος του πίνακα. Εάν η κλήση συνάρτησης δεν καθορίζει μια λίστα τα στοιχεία της οποίας αντικαθιστούν τα αρχικά στοιχεία, τότε η συνάρτηση δεν προσθέτει κανένα στοιχείο στην αρχική λίστα. Η ακόλουθη έκφραση επεξηγεί τη χρήση της συνάρτησης splice:

@list = 1..10; splice(@list,1,8,5,6); # @list = (1,5,6,10)

ΣΥΝΑΡΤΗΣΗ ΚΛΙΜΑΚΩΝ

Η βαθμωτή συνάρτηση καθορίζει τον αριθμό των στοιχείων σε μια λίστα. Έχει την εξής μορφή:

Rsult = βαθμωτό(Λίστα);

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

@list = 1..10; print scalar(@list); # Εκτυπώνει το μέγεθος του @list

ΛΕΙΤΟΥΡΓΙΑ GREP

Η συνάρτηση grep φιλτράρει στοιχεία λίστας για τα οποία αξιολογείται μια δεδομένη έκφραση<ложно>. Έχει την εξής μορφή:

@list = grep(Έκφραση, Λίστα);

Η συνάρτηση grep επαναλαμβάνεται μέσω των στοιχείων μιας λίστας, αντικαθιστώντας τα ως ορίσματα σε μια δεδομένη έκφραση. Η συνάρτηση grep εκχωρεί την τρέχουσα έκφραση ενός στοιχείου λίστας στη μεταβλητή $_ και αξιολογεί τη δεδομένη έκφραση. Εάν η έκφραση που προκύπτει είναι αληθής, τότε η συνάρτηση grep προσθέτει αυτό το στοιχείο στη λίστα που προκύπτει. Το ακόλουθο τμήμα προγράμματος επεξηγεί τη χρήση της συνάρτησης grep:

@list = grep($_ & 1, 1..10); # @list (1,3,5,7,9) @list = ("a", "" "b"); # @list("a"," ","b") @list = grep($_ eq "", @list); # @list("a","b")

Σημείωση: Εάν η έκφραση, τροποποιεί μια μεταβλητή. $_, τότε η αρχική λίστα θα τροποποιηθεί επίσης.

ΣΥΝΑΡΤΗΣΕΙΣ ΓΙΑ ΕΠΕΞΕΡΓΑΣΙΑ ΣΥΝΕΡΓΑΤΙΚΩΝ ΠΙΝΑΚΩΝ

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

ΛΕΙΤΟΥΡΓΙΑ ΚΛΕΙΔΙΩΝ

Η συνάρτηση κλειδιών επιστρέφει τις τιμές κλειδιών που αντιστοιχούν σε έναν συσχετιστικό πίνακα. Έχει την εξής μορφή:

@key_list = κλειδιά(%Array);

Η συνάρτηση πλήκτρων επιστρέφει μια σειρά πλήκτρων ως κανονική λίστα. Το ακόλουθο τμήμα προγράμματος απεικονίζει τη χρήση της λειτουργίας πλήκτρων:

$ages("Bob") = 25; $ages("Mary") = 30; $ages("Zack") = 15; @list = κλειδιά(%ages); # @list θα είναι "Zack", "Bob", "Mary" @list = πλήκτρα ταξινόμησης %ages # @ list "Bob", "Mary", "Zack" για $key (πλήκτρα ταξινόμησης %ages) ( εκτύπωση "$ το κλειδί είναι $ages($key)\n" )

ΛΕΙΤΟΥΡΓΙΑ ΑΞΙΩΝ

Η συνάρτηση τιμών επιστρέφει έναν κανονικό πίνακα που αποτελείται από τις τιμές ενός συσχετιστικού πίνακα. Έχει την εξής μορφή:

@value_list = τιμές (%Array)

Η συνάρτηση τιμών επιστρέφει έναν πίνακα συσχετιστικών τιμών πίνακα ως κανονική λίστα. Το ακόλουθο τμήμα προγράμματος απεικονίζει τη χρήση της συνάρτησης τιμών:

# Χρησιμοποιήστε τις τιμές από το προηγούμενο παράδειγμα %ages = ("Bob", 25, "Mary", 30, "Zack", 15); @list = τιμές ταξινόμησης %ages; # @list (15, 25, 30) @list = % ηλικίες; # @list("Zack", 15, "Bob", 25, "Mary", 30)

ΚΑΘΕ ΛΕΙΤΟΥΡΓΙΑ

Κάθε συνάρτηση επαναλαμβάνεται μέσω των στοιχείων σε έναν συσχετιστικό πίνακα. Έχει την εξής μορφή:

@key_values ​​= κάθε (%Array);

Κάθε φορά που το σενάριο καλεί κάθε συνάρτηση, επιστρέφει μια λίστα με δύο στοιχεία που περιέχουν ένα ζεύγος κλειδιού-τιμής. Όταν η συνάρτηση φτάσει στο τέλος της λίστας, επιστρέφει μια κενή λίστα. Την επόμενη φορά που θα κληθεί η συνάρτηση, η διαδικασία επανάληψης θα ξεκινήσει από την αρχή. Το ακόλουθο τμήμα προγράμματος επεξηγεί τη χρήση κάθε συνάρτησης:

# Χρησιμοποιήστε τις τιμές από το προηγούμενο παράδειγμα %ages = ("Bob", 25, "Mary", 30, "Zack", 15); ενώ (($name, $age) = κάθε %ages) ( # Εκτύπωση ηλικιών εκτύπωσης "$key is $ages($key)\n"; )

ΔΙΑΓΡΑΦΗ ΛΕΙΤΟΥΡΓΙΑΣ

Η συνάρτηση διαγραφής αφαιρεί στοιχεία ενός συσχετιστικού πίνακα. Έχει την εξής μορφή:

Διαγραφή $Array(Key)

Η ακόλουθη δήλωση χρησιμοποιεί τη συνάρτηση delete για να αφαιρέσει το στοιχείο που αντιστοιχεί στο κλειδί Bob από τον συσχετιστικό πίνακα $Employees:

Διαγραφή $Employees ("Bob")

ΕΠΙΧΕΙΡΗΜΑΤΑ ΓΡΑΜΜΗΣ ΕΝΤΟΛΗΣ

Τα σενάρια Perl μπορούν εύκολα να έχουν πρόσβαση σε ορίσματα γραμμής εντολών. Κάθε φορά που εκτελείται ένα σενάριο, η Perl τοποθετεί τα ορίσματα της γραμμής εντολών του σεναρίου στη μεταβλητή λίστας @ARGV. Το ακόλουθο τμήμα προγράμματος χρησιμοποιείται για την εκτύπωση ορισμάτων γραμμής εντολών στην οθόνη:

Ενώ ($arg = shift @ARGV) ( εκτύπωση "$arg\n"; )

ΠΡΟΣΒΑΣΗ ΣΤΙΣ ΜΕΤΑΒΛΗΤΕΣ ΠΕΡΙΒΑΛΛΟΝΤΟΣ

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

Εκτύπωση "$ENV(PATH)\n"; # Εκτυπώστε τον τρέχοντα κατάλογο

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

$ENV(PATH) = "c:\\myexec;".$ENV(PATH);

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

ΕΙΣΟΔΟΣ ΚΑΙ ΕΞΟΔΟΣ ΑΡΧΕΙΟΥ

Το Perl σχεδιάστηκε ειδικά για να είναι ένα επαρκές εργαλείο για την ανάγνωση και τη σύνταξη αρχείων κειμένου. Ωστόσο, όπως θα μάθετε αργότερα, η Perl εκτελεί τυχαία πρόσβαση και λειτουργίες εισόδου/εξόδου δυαδικού αρχείου. Οι λειτουργίες αρχείων απαιτούν μια λαβή αρχείου, η οποία είναι μια μεταβλητή που αντιστοιχεί σε ένα συγκεκριμένο αρχείο. Από προεπιλογή, κάθε σενάριο Perl έχει τρεις τυπικούς δείκτες που η Perl ανοίγει αυτόματα όταν εκτελείται το σενάριο: STDIN, STDOUT, STDERR. Αυτοί οι τρεις τυπικοί δείκτες αντιστοιχούν στις τυπικές ροές STDIN, STDOUT, STDERR της γλώσσας προγραμματισμού C. Επιπλέον, το σενάριο Perl μπορεί να ανοίξει πρόσθετους δείκτες σε άλλα συγκεκριμένα αρχεία.

ΑΝΟΙΓΜΑ ΑΡΧΕΙΩΝ ΚΑΙ ΑΛΛΕΣ ΡΟΕΣ

Για να μπορέσει ένα σενάριο να χρησιμοποιήσει ένα αρχείο, πρέπει να καλέσει τη λειτουργία open. Μοιάζει με αυτό:

Άνοιγμα (FileHandle[, Όνομα αρχείου])

Σε αντίθεση με τη συνάρτηση ανοιχτής βιβλιοθήκης χρόνου εκτέλεσης C, η ανοιχτή συνάρτηση Perl δεν περιέχει παράμετρο λειτουργίας στην κλήση συνάρτησης. Η Perl καθορίζει τη λειτουργία ανοίγματος ενός αρχείου με βάση το όνομα του αρχείου. Ο Πίνακας 12.3 απεικονίζει τη σχέση μεταξύ της λειτουργίας ανοίγματος αρχείου και του ονόματος αρχείου.

Τραπέζι 12.3. Συμβάσεις ονομασίας αρχείων Perl και τρόποι πρόσβασης


-Σημείωση: Η λειτουργία ροής σωλήνα μπορεί να μην υπάρχει σε όλα τα συστήματα.

Εάν ένα όνομα αρχείου παραλειφθεί από την κλήση ανοιχτής συνάρτησης, η Perl υποθέτει ότι το όνομα αρχείου περιέχεται στη μεταβλητή συμβολοσειράς $FileHandle. Όταν το σενάριο ολοκληρώσει τη χρήση του αρχείου, το κλείνει χρησιμοποιώντας τη λειτουργία κλεισίματος όπως φαίνεται παρακάτω:

Κλείσιμο (FileHandle);

Ένα τμήμα προγράμματος απεικονίζει τη χρήση των συναρτήσεων ανοίγματος και κλεισίματος:

Open(InFile, "test.dat") || καλούπι; # open for reading # test.dat open(OutFile, ">test.dat") || καλούπι; # create test.dat $AuxFile = ">>test.dat"; open(Aux, $AuxFile) || καλούπι; # ανοίγει για ολοκλήρωση # test.dat close(InFile); κλείσιμο (OutFile); κλείσιμο (Aux);

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

Στο MS-DOS, η Perl υποστηρίζει μια πρόσθετη δυνατότητα που ονομάζεται hinmode που επιτρέπει την είσοδο/έξοδο του αρχείου να εναλλάσσεται μεταξύ κειμένου και δυαδικών λειτουργιών. Στα περισσότερα συστήματα, η διάκριση μεταξύ κειμένου και δυαδικών καταστάσεων δεν έχει σημασία. Ωστόσο, για το λειτουργικό σύστημα MS-DOS, ο χαρακτήρας νέας γραμμής είναι μια ακολουθία δύο χαρακτήρων (CR+LF). Επειδή τα περισσότερα προγράμματα δεν αναμένουν να συναντήσουν δύο χαρακτήρες στο τέλος μιας γραμμής, το σύστημα I/O πρέπει να εκτελέσει τη μετατροπή. Για να χρησιμοποιήσετε τη λειτουργία binmode, πρέπει να ανοίξετε τον αντίστοιχο δείκτη. Η λειτουργία binmode έχει την ακόλουθη μορφή:

Binmode(FileHandle);

ΔΕΔΟΜΕΝΑ ΑΝΑΓΝΩΣΗΣ ΚΑΙ ΓΡΑΨΗΣ ΓΡΑΜΜΗΣ

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

Open(InFile, "Test.dat") || καλούπι; ενώ ($line = ) ( print $line; # Εκτυπώνει μια γραμμή από ένα αρχείο ) close(InFile);

Όταν ο χαρακτήρας εισόδου φτάσει στο τέλος του αρχείου, επιστρέφει το false, το οποίο στην περίπτωση αυτή τερματίζει την εκτέλεση του βρόχου while. Υπάρχει ένας ειδικός (κενός) χαρακτήρας εισαγωγής που υποδηλώνεται με<>, το οποίο έχει μια πολύ εξειδικευμένη αλλά χρήσιμη εφαρμογή. Την πρώτη φορά που ένα σενάριο χρησιμοποιεί έναν κενό χαρακτήρα εισόδου<>, αναλύει τα ορίσματα της γραμμής εντολών. Εάν η συμβολοσειρά @ARGV είναι κενή, τότε ο χαρακτήρας εισαγωγής<>διαβάζει από το STDIN. Αν αντίθετα το @ARGV δεν είναι κενό, τότε η Perl ανοίγει το πρώτο από τα αρχεία που καθορίζονται στη μεταβλητή @ARGV και διαβάζει τα περιεχόμενα του αρχείου. Όταν η Perl ολοκληρώσει την επεξεργασία ενός αρχείου, προχωρά στο επόμενο. Αφού το σενάριο διαβάσει όλα τα αρχεία, το σύμβολο<>επιστρέφει ψευδής. Τα σενάρια Perl μπορούν επίσης να χρησιμοποιήσουν τον χαρακτήρα εισόδου για να διαβάσουν ολόκληρο το περιεχόμενο ενός αρχείου σε έναν πίνακα, έτσι ώστε κάθε γραμμή του αρχείου να γίνεται στοιχείο του πίνακα. Για παράδειγμα, η ακόλουθη δήλωση διαβάζεται από το αρχείο STDIN στον πίνακα @lines:

@γραμμές = ;

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

Εκτύπωση λίστας.

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

Open(LogFile, ">>logfile.dat") || καλούπι; ############## ($m, $d, $y) = (τοπική ώρα(ώρα)) ; Εκτύπωση αρχείου καταγραφής "Αρχείο καταγραφής", Stardate ++m$/$d/$y\n"; κλείσιμο (LogFile);

Σημείωση: Ο δείκτης αρχείων και η λίστα εξόδου δεν χωρίζονται με κόμμα.

ΜΠΛΟΚ ΔΕΔΟΜΕΝΩΝ ΑΝΑΓΝΩΣΗΣ ΚΑΙ ΓΡΑΨΗΣ

Οι προγραμματιστές συχνά αντιμετωπίζουν τα αρχεία κειμένου ως ροές κειμένου απλώς και μόνο επειδή ο ένας χαρακτήρας διαδέχεται τον άλλο μέχρι τον δείκτη τέλους του αρχείου. Εάν το σενάριο πρέπει να λειτουργεί με ένα αρχείο που είναι προσανατολισμένο σε μπλοκ και όχι νήμα, τότε το σενάριο μπορεί να χρησιμοποιήσει τις συναρτήσεις sysread και syswrite για την επεξεργασία σταθερών μπλοκ δεδομένων. Οι συναρτήσεις sysread και syswrite έχουν τις ακόλουθες μορφές:

$result = sysread(FileHandle, $Var, Length[, Offset]); $result = syswrite(FileHandle, $Var, Length[, Offset]);

Εάν μια κλήση συνάρτησης καθορίζει μια μετατόπιση από την αρχή του αρχείου (Offset), τότε οι συναρτήσεις θα αναζητήσουν τη θέση από την οποία θα ξεκινήσουν τις λειτουργίες I/O. Οι συναρτήσεις sysread και syswrite περνούν δεδομένα χρησιμοποιώντας μια βαθμωτή μεταβλητή συμβολοσειράς. Επειδή οι συναρτήσεις επεξεργάζονται σταθερά μπλοκ μνήμης, τα δεδομένα μπορεί να περιέχουν δυαδικές τιμές, συμπεριλαμβανομένων μηδενικών και δεικτών τέλους αρχείου. Εάν η κλήση συνάρτησης καθορίζει μια μετατόπιση από την αρχή του αρχείου (Offset), τότε η συνάρτηση αναζητά τη θέση στο αρχείο από την οποία αρχίζει να εκτελεί λειτουργίες I/O. Εάν εργάζεστε με μπλοκ δεδομένων, τότε τα σενάρια μπορούν επίσης να χρησιμοποιούν τις ακόλουθες λειτουργίες εισόδου/εξόδου:

$result = seek(FileHandle, Position, Base); $result = tell(FileHandle); $result = eof(FileHandle);

Η συνάρτηση αναζήτησης λειτουργεί ακριβώς όπως η συνάρτηση fseek της βιβλιοθήκης χρόνου εκτέλεσης C. Η παράμετρος Θέση καθορίζει τη θέση σε σχέση με την προέλευση, η οποία με τη σειρά της καθορίζεται από την παράμετρο Βάση ως εξής:


- 0 Αναζήτηση από την αρχή των αρχείων
- 1 Αναζήτηση από την τρέχουσα θέση
- 2 Αναζήτηση από το τέλος του αρχείου

Η συνάρτηση tell της Perl λειτουργεί ακριβώς όπως η συνάρτηση ftell της βιβλιοθήκης χρόνου εκτέλεσης C. Αυτή η συνάρτηση επιστρέφει την τρέχουσα θέση στο αρχείο από το οποίο εκτελείται μια λειτουργία ανάγνωσης ή εγγραφής. Τέλος, η συνάρτηση eof, όπως και η συνάρτηση γλώσσας C feof, επιστρέφει την τιμή<истинно>ή<ложино>, το οποίο μπορεί να χρησιμοποιήσει το σενάριο για να προσδιορίσει πότε έχει φτάσει στο τέλος του αρχείου.

ΔΥΑΔΙΚΗ ΕΠΕΞΕΡΓΑΣΙΑ ΔΕΔΟΜΕΝΩΝ

Αν και η Perl επικεντρώνεται κυρίως στην επεξεργασία κειμένου, μπορεί επίσης να επεξεργάζεται δυαδικά δεδομένα. Τα σενάρια μπορούν να μετακινούν δυαδικά δεδομένα σε κομμάτια χρησιμοποιώντας μεταβλητές συμβολοσειράς και να εκτελούν λειτουργίες εισόδου/εξόδου byte χρησιμοποιώντας τις συναρτήσεις sysread και syswrite. Ωστόσο, για να καταφέρουμε οτιδήποτε<полезное>με δεδομένα, το σενάριο αναγκάζεται να μετατρέψει τα δεδομένα σε δικά του<родные>κλιμακωτές μορφές.

ΔΥΑΔΙΚΗ ΑΠΟΘΗΚΕΥΣΗ ΔΕΔΟΜΕΝΩΝ

Όταν ένα σενάριο Perl διαβάζει ένα μπλοκ δυαδικών δεδομένων χρησιμοποιώντας τη συνάρτηση sysread, τοποθετεί αυτά τα δυαδικά δεδομένα σε μια βαθμωτή μεταβλητή συμβολοσειράς. Η Perl δεν ενδιαφέρεται για το αν αυτές δίνονται, αν περιέχουν μηδενικές ή μη ASCII τιμές. Μέσα σε μια συμβολοσειρά χαρακτήρων, η Perl δέχεται bytes ως byte. Σε αντίθεση με το C, η Perl δεν χρησιμοποιεί μηδενικές συμβολοσειρές. Εάν τα δεδομένα είναι ASCII, το σενάριο μπορεί να τα επεξεργαστεί όπως οποιοδήποτε κείμενο.Αλλά εάν τα δεδομένα είναι δυαδικά, το σενάριο πρέπει να τα αποσυμπιέσει πριν μπορέσει η Perl να επεξεργαστεί τα δεδομένα.

ΑΠΟΣΥΣΚΕΥΑΣΜΟΣ ΔΥΑΔΙΚΩΝ ΧΕΙΡΙΣΤΙΚΩΝ ΔΕΔΟΜΕΝΩΝ ΣΕ ΜΕΤΑΒΛΗΤΕΣ PERL

Προκειμένου το σενάριο να αποκτήσει πρόσβαση σε δυαδικά δεδομένα, πρέπει να το αποσυσκευάσει στη δική του βαθμωτή μορφή. Τα σενάρια Perl αποσυσκευάζουν δεδομένα χρησιμοποιώντας τη συνάρτηση αποσυσκευασίας, η οποία έχει την ακόλουθη μορφή:

$result = unpack(Πρότυπο, Έκφραση);

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

($r, $g, $b) = unpack("C3", $color);# θα αποσυμπιεστεί σε 3 χαρακτήρες
- @longwords = unpack("L*", $data); # αποσυσκευάζεται σε μια λίστα με μεγάλες # λέξεις @stuff = unpack("S2L", $bin); Το # θα αποσυσκευαστεί σε 2 σορτς και μακριά

Κάθε χαρακτήρας μοτίβου μπορεί να ακολουθείται από έναν αριθμό που υποδεικνύει πόσες φορές θα χρησιμοποιηθεί αυτός ο χαρακτήρας. Εάν υπάρχει ένας αστερίσκος (*) αντί για έναν αριθμό, η λειτουργία θα εκτελεστεί σε όλα τα δεδομένα που απομένουν στη σειρά. Εάν ο αριθμός δεν παρέχεται, τότε εκτελείται μία φορά. Το σενάριο μπορεί να βάλει οποιονδήποτε αριθμό χαρακτήρων μοτίβου στη συμβολοσειρά Template. Ο Πίνακας 12.4 παραθέτει τους χαρακτήρες που περιλαμβάνονται στο Πρότυπο παραμέτρου συμβολοσειράς μαζί με μια περιγραφή της επίδρασης που έχει καθένας από αυτούς στην εκτέλεση της συνάρτησης αποσυσκευασίας.

Τραπέζι 12.4. Σύμβολα μοτίβων

Σύμβολο μοτίβου Περιγραφή
ένα
ΕΝΑ Συμβολοσειρά ASCII χωρίς μηδενικό χαρακτήρα
σι Συμβολοσειρά bit (το LSB έρχεται πρώτη)
ΣΕ Συμβολοσειρά bit (το πιο σημαντικό bit έρχεται πρώτο)
Με Χαρακτήρας με υπογραφή ενός byte
ΜΕ Ανυπόγραφος χαρακτήρας ενός byte
ρε Κινούμενο σημείο, διπλής ακρίβειας
φά Τιμή κινητής υποδιαστολής, ενιαίο μοτίβο ακριβείας
η Δεκαεξαδική συμβολοσειρά (πρώτα ψηφία χαμηλής τάξης)
Ν Δεκαεξαδική συμβολοσειρά (πρώτα τα πιο σημαντικά bits)
Εγώ Υπογεγραμμένος ακέραιος αριθμός
Εγώ Ανυπόγραφος ακέραιος αριθμός
μεγάλο Υπογεγραμμένος ακέραιος τύπος long
μεγάλο Το ίδιο, μόνο χωρίς την ταμπέλα
n Σύντομος ακέραιος
Ν Μακρύς ακέραιος
Π Δείκτης σε συμβολοσειρά
μικρό Υπογεγραμμένος σύντομος ακέραιος
μικρό Ανυπόγραφος σύντομος ακέραιος
u Αποκωδικοποίηση συμβολοσειρών
v Σύντομος ακέραιος
V Μακρύς ακέραιος
Χ Μεταβείτε ένα byte προς τα εμπρός
Χ Μεταβείτε ένα byte πίσω
@ Μεταβείτε σε μια καθορισμένη θέση σε μια γραμμή

ΣΥΣΚΕΥΑΣΙΑ ΔΕΔΟΜΕΝΩΝ ΣΕ ΔΥΑΔΙΚΕΣ ΧΟΡΔΕΣ

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

$result = pack(Πρότυπο, Λίστα);

Το ακόλουθο τμήμα προγράμματος επεξηγεί τη χρήση της συνάρτησης πακέτου:

$color = pack("C3", $r, $g, $b); $data = pack("L*", @longword); $bin = pack("S2L", @stuff);

Η συνάρτηση pack χρησιμοποιεί τους ίδιους χαρακτήρες μοτίβου με τη συνάρτηση αποσυσκευασίας, εκτός από τους χαρακτήρες a. A, u, x, x, @.

ΕΡΓΑΣΙΑ ΜΕ ΚΑΤΑΛΟΓΟΥΣ

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

ΑΝΟΙΓΜΑ, ΑΝΑΓΝΩΣΗ ΚΑΙ ΚΛΕΙΣΙΜΟ ΚΑΤΑΛΟΓΩΝ

Τα σενάρια Perl σάς επιτρέπουν να ανοίγετε και να διαβάζετε τα περιεχόμενα των αρχείων. Ομοίως, αυτά τα σενάρια ανοίγουν καταλόγους και διαβάζουν τα ονόματα των αρχείων που περιέχουν. Για να ανοίξετε έναν κατάλογο, τα σενάρια χρησιμοποιούν τη συνάρτηση opendir, περνώντας τον δείκτη του καταλόγου και τη διαδρομή σε αυτόν. Για να διαβάσετε μια λίστα αρχείων που περιέχονται σε έναν κατάλογο, το σενάριο χρησιμοποιεί τη συνάρτηση readdir. Τέλος, η συνάρτηση closeir χρησιμοποιείται για το κλείσιμο του καταλόγου. Το ακόλουθο τμήμα προγράμματος απεικονίζει τη χρήση της συνάρτησης readdir για την εμφάνιση μιας λίστας αρχείων στον τρέχοντα κατάλογο:

Opendir(Dir, $INC) || καλούπι; while ($file = readdir(Dir)) ( print "$file \n" ) closeir(Dir);

Αυτό το απόσπασμα χρησιμοποιεί τη μεταβλητή $INC για πρόσβαση στον τρέχοντα κατάλογο. Αλλάζοντας το $INC σε $ARGV, το σενάριο εμφανίζει μια λίστα αρχείων που περιέχονται στον κατάλογο που καθορίσατε στη γραμμή εντολών.

Εκτός από τις συναρτήσεις καταλόγου που συζητήθηκαν παραπάνω, η Perl προσφέρει ένα σύνολο συναρτήσεων που σας επιτρέπουν να τοποθετήσετε το τρέχον ευρετήριο σε μια λίστα καταλόγου:

$result = rewinddir(DirHandle); $result = telldir(DirHandle); $result = seekdir(DirHandle, Position);

ΜΟΡΦΗ ΕΞΟΔΟΥ

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

ΧΡΗΣΗ ΤΗΣ ΛΕΙΤΟΥΡΓΙΑΣ ΕΚΤΥΠΩΣΗΣ

Τα σενάρια σε αυτό το κεφάλαιο έκαναν εκτενή χρήση της λειτουργίας εκτύπωσης. Επιπλέον, η Perl παρέχει ειδικές μεταβλητές που επηρεάζουν τη λειτουργία της λειτουργίας εκτύπωσης. Ο Πίνακας 12.5 χαρακτηρίζει συνοπτικά αυτές τις ειδικές μεταβλητές.

Τραπέζι 12.5. Ειδικές μεταβλητές που ελέγχουν τη λειτουργία εκτύπωσης

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

$, = "*"; @list = 1..10; εκτύπωση @list; # Εκτυπώσεις 1*2*3*4*5*6*7*8*9*10

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

ΜΟΡΦΗ ΕΞΟΔΟΣ ΔΕΔΟΜΕΝΩΝ ΑΠΟ ΛΕΙΤΟΥΡΓΙΑ ΕΚΤΥΠΩΣΗΣ

Η Perl έχει συναρτήσεις printf και sprintf, οι οποίες μοιάζουν πολύ με τις αντίστοιχες συναρτήσεις της βιβλιοθήκης χρόνου εκτέλεσης C. Έχουν την ακόλουθη μορφή: $result = printf( Format, List); $result = sprintf(Μορφή, Λίστα);

Από προεπιλογή, η συνάρτηση printf στέλνει μορφοποιημένη έξοδο στο STDIO και η συνάρτηση sprintf επιστρέφει μια μορφοποιημένη συμβολοσειρά. Και στις δύο περιπτώσεις, η μορφή συμβολοσειράς είναι σχεδόν πανομοιότυπη με τις συναρτήσεις της γλώσσας C, με τη διαφορά ότι οι συναρτήσεις γλώσσας Perl δεν υποστηρίζουν τον προσδιοριστή μήκους (*). Το ακόλουθο τμήμα προγράμματος απεικονίζει τη χρήση των συναρτήσεων printf και sprintf.

$ακρίβεια = 2; $pi = 3,1415; printf("%.2f\n", $pi); Το # θα εκτυπώσει 3,14 printf("%.$(precision)f", $pi); Το # θα βγάζει 3.14

ΚΛΗΣΗ ΕΞΩΤΕΡΙΚΩΝ ΠΡΟΓΡΑΜΜΑΤΩΝ ΑΠΟ ΣΕΝΑΡΙΟ ΣΕ PERL

Κατά μία έννοια, αντικαθιστώντας τα σενάρια φλοιού, η Perl παρέχει υποστήριξη για αλληλεπίδραση συστήματος, συμπεριλαμβανομένης της κλήσης εξωτερικών προγραμμάτων. Οι ακόλουθες ενότητες συζητούν διάφορους τρόπους κλήσης εξωτερικών προγραμμάτων από σενάρια Perl. Έχετε υπόψη σας, ωστόσο, ότι επιτρέποντας σε σενάρια να εκτελούν εντολές συστήματος, ανοίγετε τρύπες ασφαλείας στον κεντρικό υπολογιστή σας. Κατά γενικό κανόνα, μην εκτελείτε εξωτερικές εντολές από ένα σενάριο Perl. Ωστόσο, εάν αναγκαστείτε να εκτελέσετε εξωτερικές εντολές από μια δέσμη ενεργειών, μπορείτε να χρησιμοποιήσετε το ενσωματωμένο σύστημα λειτουργιών, exec ή fork για αυτούς τους σκοπούς.

ΚΑΝΟΝΙΚΕΣ ΕΚΦΡΑΣΕΙΣ

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

ΤΑΚΤΙΚΕΣ ΕΚΦΡΑΣΕΙΣ ΕΠΙΣΚΟΠΗΣΗ

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

ΣΥΝΤΑΞΗ ΤΑΚΤΙΚΗΣ ΕΚΦΡΑΣΗΣ

Για να μειώσει το μέγεθος των κανονικών εκφράσεων, η Perl χρησιμοποιεί ειδικούς χαρακτήρες. Ο Πίνακας 12.6 παραθέτει μερικούς από τους χαρακτήρες που χρησιμοποιούνται από τα σενάρια Perl σε κανονικές εκφράσεις.

Τραπέζι 12.6. Σύμβολα που χρησιμοποιούνται σε κανονικές εκφράσεις

Σύμβολο Περιγραφή
. Ταιριάζει με οποιονδήποτε χαρακτήρα (εκτός από τη νέα γραμμή)
(..) Ομαδοποιεί μια ακολουθία στοιχείων
+ Ταιριάζει με το προηγούμενο μοτίβο μία ή περισσότερες φορές

-
Ταιριάζει με το μοτίβο μηδέν ή μία φορές
* Ταιριάζει με το μοτίβο μία ή μηδέν φορές
[...] Ταιριάζει με έναν χαρακτήρα από ένα δεδομένο σύνολο
[^...] Ταιριάζει με έναν χαρακτήρα από το σύνολο που προκύπτει με άρνηση
(...|...|...) Ταιριάζει με μία από τις εναλλακτικές
^ Ταιριάζει με την αρχή μιας χορδής
$ Ταιριάζει με το μοτίβο στο τέλος της γραμμής
(n,m) Ταιριάζει το μοτίβο n έως m φορές
(n) Ταιριάζει με το μοτίβο ακριβώς n φορές
(n,) Ταιριάζει με το μοτίβο τουλάχιστον n φορές
\n\tetc. Ταιριάζει με νέα γραμμή, καρτέλα κ.λπ.
\σι Ταιριάζει στα όρια λέξεων
\ΣΙ Ταιριάζει εντός των ορίων των λέξεων
\ρε Αντιστοιχεί στο σχήμα
\ΡΕ Δεν ταιριάζει με τον αριθμό
\μικρό Χώρος αγώνων
\ΜΙΚΡΟ Ταιριάζει όχι κενό
\w Ταιριάζει με ένα γράμμα ή έναν αριθμό
Ταιριάζει με χαρακτήρα που δεν είναι ούτε γράμμα ούτε αριθμός

Η Perl τοποθετεί κανονικές εκφράσεις (μοτίβα) σε κάθετες, δηλ. σε κάθετες, για παράδειγμα, με τη μορφή /pattern/. Το ακόλουθο τμήμα προγράμματος απεικονίζει κανονικές εκφράσεις Perl:

# οι ακόλουθες κανονικές εκφράσεις είναι αληθείς εάν: /ig/ # string περιέχει "ig" /(b|d|f)ig/ # string περιέχει "big", "dig" ή "fig" /+/ # string περιέχει έναν αριθμό /*/ # συμβολοσειρά περιέχει ένα αναγνωριστικό

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

ΧΡΗΣΗ ΤΑΚΤΙΚΩΝ ΕΚΦΡΑΣΕΩΝ ΓΙΑ ΑΝΑΖΗΤΗΣΗ ΛΕΞΕΩΝ ΚΛΕΙΔΙΩΝ

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

Εάν ($str =~ /pattern/)

Σε αυτήν την περίπτωση, οι τυπικές εκφράσεις παίρνουν την τιμή<истинно>αν το μοτίβο βρίσκεται σε συμβολοσειρά ($str). Εάν η συμβολοσειρά by περιέχει το μοτίβο, τότε η παράσταση επιστρέφει την τιμή<ложно>. Για παράδειγμα, η ακόλουθη έκφραση ελέγχει εάν η συμβολοσειρά περιέχει το κείμενο WebProgramming:

Εάν ($str =~ /Προγραμματισμός Ιστού/)

Για να ελέγξετε για ακριβή αντιστοίχιση, η έκφραση πρέπει να συνδέσει τη σύγκριση με την αρχή και το τέλος της συμβολοσειράς. Για παράδειγμα, η ακόλουθη έκφραση έχει την τιμή<истинно>, εάν και μόνο εάν η μεταβλητή $str παίρνει μία από τις τρεις τιμές: , ) :

($str =~ /^ba(na) (2,4)$/)

Ομοίως, η ακόλουθη έκφραση είναι αληθής εάν και μόνο εάν το $str περιέχει τη λέξη και δεν αποτελεί μέρος άλλης λέξης όπως .

($str =~ /\bthe\b/)

ΧΡΗΣΗ ΤΑΚΤΙΚΩΝ ΕΚΦΡΑΣΕΩΝ ΓΙΑ ΑΝΑΛΥΣΗ ΣΤΟΙΧΕΙΩΝ ΕΙΣΑΓΩΓΗΣ

Καθώς τα σενάρια Perl σας γίνονται πιο περίπλοκα, θα υπάρχουν πολλές περιπτώσεις όπου θέλετε να μάθετε περισσότερα από το να ελέγξετε εάν ένα μοτίβο ταιριάζει με μια συμβολοσειρά ή όχι. Για παράδειγμα, μπορεί να θέλετε ένα σενάριο να εξάγει μια συγκεκριμένη τιμή συμβολοσειράς. Χρησιμοποιώντας ομαδοποίηση χαρακτήρων () σε μια κανονική έκφραση, το σενάριο μπορεί να εξαγάγει τιμές που ταιριάζουν από μια συμβολοσειρά και να σχηματίσει μια λίστα με αυτές. Για παράδειγμα, το ακόλουθο τμήμα προγράμματος χρησιμοποιεί κανονικές εκφράσεις για την εξαγωγή μηνών, ημερών και ετών από μια λίστα:

$str = "1 Ιανουαρίου 1997,"; ($m, $d, $y) = $str =~ /\s*(\S*)\s + (\d+)\D + (\d(4))/;


- Παραλείψτε πρώτα οποιονδήποτε ειδικό χαρακτήρα.
- γράψτε όλους τους μη ειδικούς χαρακτήρες στη μεταβλητή $m
- (μεταβλητή για να υποδεικνύει μήνες).
- παράλειψη ειδικού χαρακτήρα.
- Τοποθετήστε όλους τους αριθμούς στη μεταβλητή $d (μεταβλητή για ημέρες εγγραφής).
- παράβλεψη όλων των χαρακτήρων που δεν είναι αριθμοί.
- γράψτε τέσσερα ψηφία στη μεταβλητή $y (μεταβλητή για να υποδείξει τα έτη).

Η Perl υποστηρίζει επίσης μια άλλη μορφή αντιστοίχισης προτύπων, χρησιμοποιώντας τον τελεστή (=~), ο οποίος προσθέτει την άρνηση του αποτελέσματος: (!~). Αυτός ο τελεστής είναι ισοδύναμος με την έκφραση!($str=~/pattern/).

ΤΑΚΤΙΚΕΣ ΕΚΦΡΑΣΕΙΣ ΓΙΑ ΑΝΑΖΗΤΗΣΗ ΚΑΙ ΑΝΤΙΚΑΤΑΣΤΑΣΗ ΧΟΡΔΩΝ

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

$str =~ s/pattern/replacement/;

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

$str =~ s/\bcolour\b/color/;

Μια μικρή τροποποίηση σάς επιτρέπει να αντικαταστήσετε όλες τις λέξεις επί :

$str =~ s/\bcolour\b/color/g;

Σε αυτήν την περίπτωση, το g στο τέλος της έκφρασης λέει στην Perl ότι απαιτείται καθολική αντικατάσταση.

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

$str =~ tr/SearchList/ReplacementList/;

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

$str =~ tr/a-z/A-Z/; # αλλάζει πεζά από κάτω προς τα πάνω

Εξετάστε μόνοι σας το ακόλουθο παράδειγμα:

$letters = "abcde"; εκτύπωση "$letters\n" # Εκτύπωση abcde $letters =~ tr/a-z/A-Z/; εκτύπωση "$letters\n" # Εκτύπωση ABCDE

ΠΕΡΙΛΗΨΗ

Αυτό το κεφάλαιο παρέχει μια εισαγωγή στον προγραμματισμό Perl. Χρησιμοποιώντας τις έννοιες που συζητούνται εδώ, μπορείτε να γράψετε πολύπλοκα σενάρια CGI σε Perl. Το επόμενο κεφάλαιο θα σας βοηθήσει να αποκτήσετε τις δεξιότητες για τη δημιουργία σεναρίων CGI στην Perl που μπορείτε να εκτελέσετε στον δικό σας διακομιστή. Πριν προχωρήσετε περαιτέρω, βεβαιωθείτε ότι κατανοείτε τις ακόλουθες βασικές έννοιες:

Η Perl είναι μια ερμηνευμένη γλώσσα προγραμματισμού που χρησιμοποιείται από προγραμματιστές για τη σύνταξη σεναρίων για τον Ιστό και το Διαδίκτυο.

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

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

ΑΠΑΡΑΙΤΗΤΕΣ ΙΣΤΟΣΕΛΙΔΕΣ ΓΙΑ ΠΛΗΡΟΦΟΡΙΕΣ ΓΙΑ ΤΗΝ PERL

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

ΠΕΡΙΛΗΨΗ

Σε αυτό το κεφάλαιο, μάθατε πώς να χρησιμοποιείτε την Perl για να γράφετε αρκετά περίπλοκα σενάρια CGI. Χρησιμοποιώντας την τεχνολογία με την οποία έχετε εξοικειωθεί, μπορείτε να παρέχετε υπηρεσίες προγραμματισμού επαγγελματικού επιπέδου στους πελάτες σας που θα ήθελαν η επιχείρησή τους να εκπροσωπείται στον Ιστό. Το Κεφάλαιο 14 σας εισάγει στη γλώσσα Java. Όπως θα δείτε, η Java είναι κατάλληλη για τη δημιουργία τοποθεσιών Web που περιέχουν κινούμενα σχέδια και πολυμέσα. Επιπλέον, το Κεφάλαιο 14 εισάγει μια άλλη γλώσσα για τη σύνταξη σεναρίων JavaScript. Ωστόσο, προτού προχωρήσετε στο Κεφάλαιο 14, βεβαιωθείτε ότι κατανοείτε τις ακόλουθες βασικές έννοιες:
- Η Perl είναι μια ευέλικτη και ευέλικτη γλώσσα προγραμματισμού που μπορεί να χρησιμοποιηθεί για την ανάπτυξη σεναρίων CGI για τον Ιστό καθώς και παραδοσιακών προγραμμάτων για καθημερινή χρήση.

  • Η Perl είναι κατάλληλη για επεξεργασία κειμένου, πρόσβαση σε βάσεις δεδομένων, είναι φορητή και παρέχει ασφάλεια κατά την εργασία σε δίκτυα. Όλα αυτά τα χαρακτηριστικά είναι σημαντικά για τον προγραμματισμό Ιστού.
  • Τα σενάρια Perl χρησιμοποιούν ευρέως κανονικές εκφράσεις για την επεξεργασία κειμένου.
  • Τα περισσότερα σενάρια στον Ιστό είναι πλέον γραμμένα σε Perl. Ωστόσο, γλώσσες όπως η JavaScript και η VBScript ενδέχεται να καταπατήσουν το μονοπώλιο της Perl.

Η γλώσσα Perl δημιουργήθηκε το 1987 από έναν Αμερικανό προγραμματιστή με γλωσσικό υπόβαθρο, τον Larry Wall. Ένα χρόνο μετά τη δημιουργία της, το 1988, η γλώσσα πρόσθεσε υποστήριξη για κανονικές εκφράσεις και το 1989, η επεξεργασία των ροών δεδομένων που παρουσιάστηκαν σε δυαδική μορφή. Οι εργασίες για τη γλώσσα Perl συνεχίζονται. Οι πρόσφατες εκδόσεις της Perl έχουν προσθέσει υποστήριξη για πολύπλοκους τύπους δεδομένων και ένα μοντέλο αντικειμένου.

Χαρακτηριστικά της γλώσσας Perl.

Η δομή της Perl είναι παρόμοια με τη γλώσσα C. Ορισμένες ιδιότητες της γλώσσας Perl είναι δανεισμένες από τις γλώσσες του κελύφους εντολών των συστημάτων UNIX.

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

Πλεονεκτήματα.

Πλεονεκτήματα της γλώσσας Perl:

  • ενσωματωμένα εργαλεία για εργασία με πολύπλοκες δομές.
  • ελεύθερη σύνταξη (το ίδιο πρόβλημα μπορεί να λυθεί με διαφορετικούς τρόπους).
  • πολλές έτοιμες βιβλιοθήκες - ενότητες.
  • υποστήριξη για εργασία με κανονικές εκφράσεις.
  • απλή επεξεργασία μεγάλου όγκου δεδομένων·
  • την ικανότητα προγραμματισμού σε αντικειμενοστραφή ή «λειτουργικό» στυλ.
  • cross-platform.

Ελαττώματα.

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

Η γλώσσα διατηρεί παλαιότερα δημοφιλείς, αλλά τώρα ξεπερασμένες προσεγγίσεις. Ωστόσο, ορισμένα από αυτά μπορεί να είναι κατάλληλα για συγκεκριμένες εργασίες λογισμικού.

Εικονική φιλοξενία ιστότοπου για δημοφιλές CMS:

Σε τι χρησιμεύει?

Υποστήριξη συστήματος για Windows και UNIX.

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

ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ.

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

CGU - σενάρια.

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

Υποστήριξη ιστότοπου.

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

Εμφανίστηκε το 1987.

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

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

Η Perl είναι η μόνη γλώσσα στην οποία τα προγράμματα φαίνονται ίδια πριν και μετά την κρυπτογράφηση RSA.

Τη στιγμή της σύνταξης αυτού του υλικού, η τρέχουσα έκδοση του διερμηνέα είναι η 5.22.0. Το Perl 6 αναμένεται να κυκλοφορήσει το 2015, αλλά δεν είναι ακόμα καλά τεκμηριωμένο.

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

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

Παρεμπιπτόντως, δεν πρέπει να ξεκινήσετε ούτε με PHP. Τώρα ας πάμε στη δουλειά.

Περιβάλλον χρόνου εκτέλεσης

Επί του παρόντος, η Perl υποστηρίζεται επίσημα σε τρεις κορυφαίες πλατφόρμες: Mac OS X, Unix και Windows. Στα δύο πρώτα από αυτά, το περιβάλλον χρόνου εκτέλεσης Perl είναι προεγκατεστημένο και η έκδοσή του μπορεί να βρεθεί χρησιμοποιώντας την εντολή perl -v (η πιο πρόσφατη έκδοση μπορεί να γίνει λήψη) και για λειτουργικά συστήματα της οικογένειας Windows, ο διερμηνέας Perl είναι διαθέσιμο για λήψη σε αυτή τη σελίδα. Συνιστάται να επιλέξετε το ActivePerl (διανομή από το ActiveState) ως το πιο κοινό.

Ολοκληρωμένο Αναπτυξιακό Περιβάλλον (IDE)

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

Padre, το Perl IDE

Ένα πολυπλατφορμικό, ελαφρύ περιβάλλον ανάπτυξης σχεδιασμένο ειδικά για την Perl και φιλικό προς τον χρήστη για αρχάριους. Εκτός από την παραδοσιακή επισήμανση σύνταξης και την αυτόματη συμπλήρωση, διαθέτει επίσης ενσωματωμένα εργαλεία ανακατασκευής. Παρεμπιπτόντως, ο ίδιος ο Padre είναι γραμμένος στο Perl 5.

Επεξεργαστές κειμένου

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

  • KomodoEdit - μια απογυμνωμένη έκδοση του εμπορικού περιβάλλοντος ανάπτυξης Komodo IDE, που αναπτύχθηκε από την ActiveState (η ίδια που υποστηρίζει τη διανομή ActivePerl), έχει λειτουργίες αυτόματης συμπλήρωσης, επισήμανσης σύνταξης, πολλαπλών δρομέων και συμβουλές τεκμηρίωσης.
  • Το Vim είναι ένα πρόγραμμα επεξεργασίας κειμένου του οποίου η διεπαφή μπορεί να είναι ασυνήθιστη για έναν χρήστη των Windows. υποστηρίζει επισήμανση σύνταξης.
  • Το Sublime Text είναι ένα από τα καλύτερα εργαλεία επεξεργασίας πηγαίου κώδικα με επισήμανση σύνταξης, αυτόματη συμπλήρωση κ.λπ., η λειτουργικότητα του οποίου επεκτείνεται από πολλά υπάρχοντα πρόσθετα.
  • Το Notepad++ είναι ένα ελαφρύ πρόγραμμα επεξεργασίας κειμένου που διαθέτει την πιο σωστή επισήμανση σύνταξης μετά το KomodoEdit. Η λειτουργικότητα μπορεί να επεκταθεί με πρόσθετα, αλλά υπάρχουν αρκετά από αυτά ειδικά για την Perl.

CodeGround

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

Το πρώτο "Γεια σου, κόσμο!" στο Perl

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

Εκτύπωση "Hello World\n";

Αποθηκεύστε αυτή τη γραμμή στο αρχείο hello.pl και εκτελέστε το πρόγραμμα που μόλις δημιουργήσατε με την εντολή:

Perl hello.pl

Ωστόσο, πρώτα βεβαιωθείτε ότι τα εκτελέσιμα Perl είναι μεταξύ των μεταβλητών περιβάλλοντος (μεταβλητές περιβάλλοντος) και ότι καλείτε την perl από το φάκελο όπου βρίσκεται το αρχείο προέλευσης hello.pl. Εάν είναι επιτυχής, θα δείτε το αναμενόμενο "Hello, world!"

Συγχαρητήρια, ξεκινήσατε να γράφετε Perl!

Και μετά στο δρόμο μας...

Ένα εξαιρετικό σεμινάριο αγγλικών για τη γλώσσα προγραμματισμού Perl για γρήγορη εκκίνηση μπορείτε να βρείτε στο tutorialspoint.com. Επιπλέον, υπάρχει ένας επίσημος εκπαιδευτικός πόρος -

Συμβαίνει να ξέρω τουλάχιστον δύο άτομα που θα ήθελαν να μάθουν Perl. Αποφάσισα να γράψω αυτό το post ειδικά για αυτούς.

  • Μέρος 1: Τύποι μεταβλητών (Διαβάζετε αυτό το μέρος)

Σε αυτό θα βρείτε παραδείγματα απλών προγραμμάτων από τη σειρά "εκτύπωση αριθμών από 1 έως 5" και παρόμοια. Πάντα μου άρεσε να μαθαίνω από παραδείγματα - είναι πιο ενδιαφέρον και πιο γρήγορο παρά από βιβλία ή σεμινάρια. Μπορείτε επίσης να δείτε τις αναρτήσεις σε αυτό το ιστολόγιο - το πιθανότερο είναι ότι θα βρείτε περισσότερα παραδείγματα εκεί.

Υποθέτω ότι στο σχολείο/ινστιτούτο σπουδάσατε Pascal/Delphi, C ή τουλάχιστον Basic, και δεν χρειάζεται να εξηγήσετε τι είναι η συνάρτηση και οι βρόχοι. Αν δεν συμβαίνει αυτό, δεν πειράζει, απλά θα πρέπει να αφιερώσετε επιπλέον χρόνο διαβάζοντας τη Wikipedia για να το καταλάβετε. Εάν δεν ξέρετε πώς να εκτελέσετε ένα σενάριο bash ή γιατί στην πρώτη γραμμή του σεναρίου θα πρέπει να γράψετε κάτι σαν #!/bin/sh, θα πρέπει να κάνετε λίγο γκουγκλάρισμα για να το μάθετε.

Ειδικά για όσους ενδιαφέρονται για τις ερωτήσεις «είναι αλήθεια ότι η Perl είναι πολύ περίπλοκη», «τι βιβλία για την Perl μπορείτε να προτείνετε» και ακόμη και «εεε... είναι ακόμα γραμμένο σε αυτό;», έγραψα ένα Mini- Συχνές ερωτήσεις για την Perl , τις οποίες μπορείτε να διαβάσετε στο HabraHabr. Και για όσους δεν ενίσχυσε πολλά γράμματαΕδώ θα κάνω μια σύντομη περίληψη:

  • Η Perl είναι μια σύγχρονη γλώσσα προγραμματισμού που έχει γραφτεί και θα συνεχίσει να γράφεται για πολύ καιρό.
  • Η Perl, όπως και κάθε άλλη γλώσσα προγραμματισμού, έχει τα πλεονεκτήματα, τα μειονεκτήματα και τις εφαρμογές της. Υπάρχει πολύ μεγάλοκατηγορία προβλημάτων που λύνει η Perl με 5+.
  • Η σύνταξη της Perl δεν είναι πιο περίπλοκη από τη σύνταξη της C++ ή της Java. Μπορείτε να το επιβεβαιώσετε διαβάζοντας αυτήν την ανάρτηση μέχρι το τέλος.
  • Υπάρχουν καλά, αλλά φθηνά μαθήματα Perl. Μπορείτε επίσης να βρείτε εύκολα μια κοινότητα προγραμματιστών Perl στο διαδίκτυο που μιλούν τη μητρική σας γλώσσα.
  • Η Perl λειτουργεί καλά τόσο με λειτουργικά συστήματα οικογένειας UNIX όσο και με Windows Evil.

Πρόσθεση:Σας προτείνω επίσης να διαβάσετε τα άρθρα Perl vs Python vs Ruby vs PHP και Priests of Programming. Το πρώτο μιλάει για την απόδοση διαφόρων γλωσσών δέσμης ενεργειών, το δεύτερο μιλά για τη διαφορά μεταξύ της PHP και άλλων γλωσσών. Για τους λάτρεις της Python, σας συμβουλεύω να διαβάσετε το άρθρο Test performance script Python. Ελπίζω ότι αυτά τα υλικά θα σας βοηθήσουν να βρείτε την απάντηση στην ερώτηση "τι είναι καλό για την Perl".

Γεια σας %username%!

Λοιπόν, ας γράψουμε ήδη το πρώτο μας σενάριο Perl!

#!/usr/bin/perl

$name = shift() ;
print("Γεια σου, $name! \n") ;

Ας τρέξουμε το σενάριο:

$ chmod u+x 1 .pl
$ ./ 1 .pl αφίσκον
Γεια σου Αφίσκον!

Όλα είναι πολύ απλά εδώ:

  • Τα ονόματα των βαθμωτών μεταβλητών (δηλαδή, όχι πίνακες ή κατακερματισμοί, τι είναι - δείτε παρακάτω) ξεκινούν με ένα σύμβολο του δολαρίου.
  • Η συνάρτηση shift επιστρέφει το επόμενο όρισμα σεναρίου. Με άλλα λόγια, η πρώτη κλήση στη shift() επιστρέφει το πρώτο όρισμα, η δεύτερη κλήση επιστρέφει το δεύτερο όρισμα και ούτω καθεξής.
  • Η συνάρτηση print() εκτυπώνει τη συμβολοσειρά που δόθηκε ως όρισμα.
  • Μπορείτε να αντικαταστήσετε τις μεταβλητές τιμές στη γραμμή (βλ. γραμμή 4). Για περισσότερες πληροφορίες σχετικά με τις χορδές, δείτε παρακάτω.

Αν δεν είναι ακόμα πολύ σαφές, δεν πειράζει. Ίσως λίγη θεωρία να φέρει λίγη περισσότερη σαφήνεια.

Μεταβλητοί τύποι

Υπάρχουν τρεις κύριοι τύποι μεταβλητών στο Perl: σκαλοπάτια(αριθμοί και συμβολοσειρές), πίνακες- παρόμοια με αυτά που χρησιμοποιούνται στο Pascal ή στο C (μερικές φορές οι πίνακες ονομάζονται επίσης διανύσματα) και κατακερματισμοί(συσχετιστικοί πίνακες).

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

#!/usr/bin/perl

$a = 123 ;
$b = - 7,496 ;
$c = 0xABC; Το # ισούται με 2748, ναι, είναι ένα σχόλιο :)
$d = ($a + $b ) / $c ;
$d *= $a ; # ίδιο με $d = $d * $a;

$str1 = "γεια" ;
$str2 = "$str1, κόσμος" ; Το # $str2 περιέχει "γεια, κόσμος"
$str3 = $a . " \n". $str2 ;
$str4 = "$str1" ; # $str4 περιέχει "$str1", όχι "γεια"

Εδώ ορίζουμε θετικούς και αρνητικούς, ακέραιους και κλασματικούς αριθμούς, ορίζουμε έναν αριθμό σε δεκαεξαδική κωδικοποίηση, προσθέτουμε, πολλαπλασιάζουμε και διαιρούμε - όλα όπως στο C ή στην Java. Εκτός από τις παραπάνω πράξεις, η Perl υποστηρίζει επίσης τη λειτουργία εκθέσεως:

$a = 2 ** 8 ; # αποτέλεσμα: 256

Με τις συμβολοσειρές, όλα είναι περίπου ίδια όπως σε κάποια PHP. Η κουκκίδα σημαίνει τη λειτουργία συνένωσης (δηλαδή, "κόλληση" συμβολοσειρών μεταξύ τους), εάν η συμβολοσειρά περιέχει ονόματα μεταβλητών, οι τιμές αντικαθίστανται στη θέση τους. Χρησιμοποιώντας μια ανάστροφη κάθετο, μπορείτε να εισαγάγετε χαρακτήρες νέας γραμμής (\n), καρτέλες (\ t), εισαγωγικά (\" ), η ίδια η ανάστροφη κάθετο (\\), το σύμβολο του δολαρίου χωρίς καμία αντικατάσταση μεταβλητής (\$) κ.λπ. Εάν η συμβολοσειρά είναι σε μονά εισαγωγικά, οι χαρακτήρες σε αυτήν αντιμετωπίζονται "ως έχουν", χωρίς μεταβλητή αντικατάσταση κ.λπ.

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

$int1 = "11" + 22 ;
# ^ η συμβολοσειρά "11" μετατρέπεται σε αριθμό,
# μετά την οποία πραγματοποιείται η προσθήκη, αποτέλεσμα: 33.
$str1 = "11" . 22;
# ^ ο αριθμός 22 μετατρέπεται σε συμβολοσειρά,
# μετά την οποία πραγματοποιείται η συνένωση, το αποτέλεσμα είναι "1122".

Οι κανόνες για τη μετατροπή από συμβολοσειρά σε αριθμό και αντίστροφα είναι οι ίδιοι όπως στην PHP:

$str1 = 0 . "abc" ;
# ^ το αποτέλεσμα είναι "abc", ο αριθμός μηδέν μετατρέπεται στην κενή συμβολοσειρά
$int1 = "aaa" + 1 ;
# ^ το αποτέλεσμα είναι 1, δεν υπάρχουν αριθμοί στη συμβολοσειρά "aaa"
$int2 = "12aaa" + 1 ;
Το αποτέλεσμα # ^ είναι 13, λαμβάνονται υπόψη μόνο τα πρώτα ψηφία της συμβολοσειράς

Παρεμπιπτόντως, υπάρχουν ειδικοί τελεστές για τη δήλωση μακριών συμβολοσειρών - q και qq:

# παρόμοια με μεμονωμένα εισαγωγικά
$κείμενο = q (
Έχετε 15 $;
} ;
# παρόμοια με διπλά εισαγωγικά
$message = qq (
Γεια σας, $username!
Πώς είσαι;
} ;

Εργασία με Πίνακεςσυμβαίνει ως εξής:

#!/usr/bin/perl

$scalar = "bebebebe" ;
($a, $b) = (1, 2); # ίδιο με $a = 1; $b = 2;
@arr = ("aaa" , 123 , $scalar , $a + $b );
εκτύπωση $arr [ 1 ] . " \n";
push @arr , $a ;
print pop (@arr) . " \n";

Εδώ δημιουργούμε έναν πίνακα @arr που αποτελείται από 4 στοιχεία (γραμμή 5). Στη συνέχεια βγάζουμε το δεύτερο στοιχείο (γραμμή 6). Η αρίθμηση των στοιχείων ξεκινά από το μηδέν, επομένως χρησιμοποιείται το δείκτη 1 για την εμφάνιση του δεύτερου στοιχείου. Στη συνέχεια βάζουμε την τιμή της μεταβλητής $a στο τέλος του πίνακα (συνάρτηση push, γραμμή 7) και αμέσως την ανακτούμε και την εμφανίζουμε ( συνάρτηση pop, γραμμή 8).

Λάβετε υπόψη ότι τα ονόματα των συστοιχιών ξεκινούν με "σκύλος" και όχι με δολάριο (δεν είναι δύσκολο να θυμάστε - τα αντίστοιχα σύμβολα είναι παρόμοια με τα πρώτα γράμματα των ονομάτων αγγλικών τύπων: $ - scalar, @ - array). Κατά την πρόσβαση στο δεύτερο στοιχείο πίνακα (γραμμή 6), χρησιμοποιήθηκε το σύμβολο του δολαρίου επειδή το στοιχείο του πίνακα είναι βαθμωτό. Στην αρχή αυτό προκαλεί μεγάλη σύγχυση, αλλά σε γενικές γραμμές όλα είναι λογικά.

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

Για να δηλώσετε έναν πίνακα του οποίου τα στοιχεία είναι συμβολοσειρές χωρίς κενά, υπάρχει ένας ειδικός τελεστής - qw:

@arr = qw/aaa bbb ccc/ ;
# παρόμοια με ("aaa", "bbb", "ccc"), μόνο μικρότερη

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

#!/usr/bin/perl

%hash = ( # όταν δηλώνετε κατακερματισμούς και πίνακες μπορείτε
"x" => 12, # χρησιμοποιήστε αλλαγές γραμμής
y => 53, # εάν δεν υπάρχουν ειδικοί χαρακτήρες στο κλειδί, δεν χρειάζονται εισαγωγικά
"z" => - 10,5 , # μπορείτε να αφήσετε κόμμα στο τέλος
) ;

$hash("x")++; Η συντεταγμένη # x είναι τώρα 13
$hash ( y ) --; Η συντεταγμένη # y είναι τώρα 52

# συντεταγμένες εμφάνισης
Τυπώνω "x = $hash(x), y = $hash(y), z = $hash(z)\n";

Τα ονόματα κατακερματισμού ξεκινούν με ένα σύμβολο ποσοστού και οι σγουρές αγκύλες χρησιμοποιούνται για να αναφέρονται σε ένα στοιχείο (και όχι σε αγκύλες, όπως συμβαίνει με τους πίνακες). Εάν το όνομα του κλειδιού είναι γνωστό εκ των προτέρων, μπορείτε να το καθορίσετε χωρίς εισαγωγικά (γραμμή 10).

Παρεμπιπτόντως, οι μεταβλητές $test, @test και %test είναι εντελώς ανεξάρτητες μεταβλητές διαφορετικών τύπων.

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

  • Δηλώσεις υπό όρους;
  • Για και ενώ βρόχους?
  • Δήλωση λειτουργιών;
  • Εργασία με ροές και αρχεία.
  • Αυστηρή σύνταξη;
  • Χρήση έτοιμων ενοτήτων και τάξεων.

Θα γράψω για αυτό σε μια από τις παρακάτω αναρτήσεις. Θα ήθελα να λάβω τουλάχιστον μερικά σχόλια σε αυτήν την ανάρτηση - ενδιαφέροντα/μη ενδιαφέροντα, κατανοητά/ακατανόητα και ούτω καθεξής. Παρεμπιπτόντως, αν έχετε ερωτήσεις σχετικά με την Perl (όχι απαραίτητα με αυτήν την ανάρτηση), μη διστάσετε να τις ρωτήσετε στα σχόλια!

Ελπίζω ότι αυτή η σειρά αναρτήσεων σχετικά με τον προγραμματισμό στην Perl θα σας βοηθήσει να γράψετε τα πρώτα σας απλά σενάρια. Με τον καιρό, τα σενάρια θα γίνουν πιο σύνθετα, θα χρησιμοποιούν νέες τεχνολογίες (OOP, κανονικές εκφράσεις) και μετά από λίγο θα διαπιστώσετε ότι γνωρίζετε αρκετά για την Perl για να μοιραστείτε την εμπειρία σας με άλλους.