Υπορουτίνες#
Μια υπορουτίνα είναι ένα κατονομασμένο (ή ανώνυμο) μπλοκ κώδικα που δέχεται μια λίστα ορισμάτων, εκτελείται σε μια νέα λεξιλογική εμβέλεια, και επιστρέφει μια λίστα τιμών. Οι υπορουτίνες είναι η μονάδα επαναχρησιμοποίησης στην Perl, η μονάδα αποστολής για αντικειμενοστραφή κώδικα, και - μέσω closures
η μονάδα ενθυλάκωσης με κατάσταση. Σχεδόν τα πάντα στη γλώσσα είναι χτισμένα πάνω τους.
Η PetaPerl υλοποιεί το πλήρες μοντέλο υπορουτινών της Perl 5.42: την κλασική σύμβαση κλήσης βασισμένη στο @_, τις σύγχρονες υπογραφές, τον μηχανισμό πρωτοτύπων που ελέγχει την ανάλυση στο σημείο κλήσης, λεξιλογική εμβέλεια και εμβέλεια πακέτου (my, our, local, state), closures, το σύστημα γνωρισμάτων (:lvalue, :method, :prototype(...)), αναδρομή με κλήσεις ουράς goto &sub, και τα ειδικά μπλοκ μεταγλώττισης και χρόνου εκτέλεσης (BEGIN, END, INIT, CHECK, UNITCHECK).
Αυτή η αναφορά είναι χωρισμένη σε μία σελίδα ανά θέμα. Ο κανόνας ψευδωνυμοποίησης του @_ βρίσκεται στα ορίσματα, η παγίδα του closure-πάνω-σε-μεταβλητή-βρόχου βρίσκεται στην εμβέλεια, οι επιδράσεις των πρωτοτύπων σε επίπεδο αναλυτή βρίσκονται στα πρωτότυπα - ώστε κάθε σελίδα να μπορεί να διαβαστεί και να επισκεφθεί ξανά χωρίς ευρύτερο πλαίσιο.
Επιλέξτε θέμα#
Δήλωση -
sub NAME { ... }, ανώνυμες subs, προδηλώσεις, αναφορές κώδικα, το sigil&και τι σας προσφέρει η προδήλωση.Ορίσματα και
@_- ο κανόνας ψευδωνυμοποίησης, το ιδίωμα αποσυσκευασίας, συμβάσεις ονομαστικών ορισμάτων, προεπιλογέςshift, η νόμιμη χρήση ψευδωνυμοποίησης στοchomp(@lines), και η παγίδα$_[0] = ....Τιμές επιστροφής - ρητό
return, σιωπηρή τελευταία-έκφραση, ισοπέδωση λίστας κατά την επιστροφή, συντομεύσεις κενού περιβάλλοντος, και η διαφορά μεταξύreturn;καιreturn undef;.Εμβέλεια:
my,our,local,state- διάρκεια ζωής pad, closures, η έκπληξη του closure-πάνω-σε-μεταβλητή-βρόχου, πότε τοlocalείναι το κατάλληλο εργαλείο, και τι σημαίνει πραγματικά τοstate.Πρωτότυπα - τι κάνουν (ανάλυση στο σημείο κλήσης), τι δεν κάνουν (έλεγχοι χρόνου εκτέλεσης), η διαφορά
(\@)έναντι(@), το πρωτότυπο σταθεροποίησης(), και γιατί ο περισσότερος σύγχρονος κώδικας δεν θα πρέπει να τα χρησιμοποιεί.Υπογραφές - η σύγχρονη σύνταξη από την 5.20+ σταθερή στην 5.36, με παραμέτρους κατά θέση, προαιρετικές, και slurpy· προεπιλεγμένες τιμές· ονομαστικές παράμετροι μέσω slurpy hash· και πώς αλληλεπιδρούν οι υπογραφές με τα πρωτότυπα (χωρίς να τα αντικαθιστούν).
Αναδρομή - όριο βάθους, αμοιβαία αναδρομή,
goto &fnγια κλήσεις ουράς,__SUB__για ανώνυμη αυτο-αναφορά, trampolines.Lvalue subs και περιβάλλον - σημασιολογία
:lvalue,wantarray, ο τριμερής διακόπτης κενό-βαθμωτό-λίστα, και το τυπικό μοτίβο «πρόωρη επιστροφή σε κενό περιβάλλον».Γνωρίσματα -
:method,:lvalue,:prototype(...),:const, γνωρίσματα τρίτων, και πώς συνδυάζονται τα τέσσερα βήματα σχετικά με γνωρίσματα (ανάλυση, καταχώρηση, αποθήκευση, ερώτημα).Phasers - τα μπλοκ
BEGIN,UNITCHECK,CHECK,INITκαιEND: πότε πυροδοτείται το καθένα σε σχέση με το όριο μεταγλώττισης/εκτέλεσης, η σειρά τους FIFO/LIFO, το$?και το${^GLOBAL_PHASE}μέσα στοEND, και το μπλοκdefer.
Ορισμός sub έναντι κλήσης sub#
Τα δύο μισά του συστήματος υπορουτινών είναι σε μεγάλο βαθμό ορθογώνια:
Ορισμός είναι μια δήλωση συν ένα σώμα. Η δήλωση καθορίζει το όνομα (ή κάνει τη sub ανώνυμη), το προαιρετικό πρωτότυπο ή υπογραφή, τα προαιρετικά γνωρίσματα. Το σώμα είναι ένα μπλοκ δηλώσεων με δικό του pad.
Κλήση μετατρέπει μια λίστα εκφράσεων στο
@_του νέου pad (ή σε μεταβλητές υπογραφής), εκτελεί το σώμα, και συλλέγει ό,τι επέστρεψε το σώμα στο περιβάλλον του καλούντος.
Σχεδόν κάθε «λεπτή» ερώτηση σχετικά με υπορουτίνες αφορά τη μία πλευρά ή την άλλη. Τα πρωτότυπα επηρεάζουν μόνο τις κλήσεις, όχι τους ορισμούς· οι υπογραφές επηρεάζουν τι βλέπει το σώμα, όχι πώς ο καλών γράφει την κλήση· τα γνωρίσματα επηρεάζουν πώς αντιμετωπίζεται η ορισμένη sub από τον χρόνο εκτέλεσης.
Ο κλασικός έναντι του σύγχρονου διαχωρισμός#
Η Perl διαθέτει δύο παράλληλους μηχανισμούς περάσματος ορισμάτων:
# Classic: @_ aliasing, manual unpacking
sub add {
my ($a, $b) = @_;
return $a + $b;
}
# Modern: signatures, named lexicals, arity checking
use feature 'signatures';
sub add ($a, $b) {
return $a + $b;
}
Και οι δύο υποστηρίζονται πλήρως. Οι υπογραφές δεν αντικαθιστούν το @_· είναι μια επιπρόσθετη, πιο δηλωτική είσοδος στην ίδια σύμβαση κλήσης. Μέσα σε μια sub που χρησιμοποιεί υπογραφή, το @_ εξακολουθεί να γεμίζεται (αυτό ορίζεται από την υλοποίηση και αποθαρρύνεται να βασίζεστε σε αυτό, αλλά ισχύει στην 5.42).
Ο διαχωρισμός μεταξύ κλασικού και σύγχρονου είναι η πιο χρήσιμη πυξίδα προσανατολισμού όταν διαβάζετε κώδικα Perl άλλων. Ο περισσότερος παλαιότερος κώδικας χρησιμοποιεί την κλασική μορφή· ο περισσότερος νεότερος χρησιμοποιεί υπογραφές· και οι δύο θα βρίσκονται μπροστά σας σε κάθε μη τετριμμένη βάση κώδικα.
Δείτε επίσης#
perlop- τελεστές που αλληλεπιδρούν με subs:->για αποστολή μεθόδου και επίκληση αναφοράς κώδικα,,(και το fat comma) για κατασκευή ονομαστικών ορισμάτων,=για την ανάθεση λίστας που χρησιμοποιείται στο ιδίωμαmy (...) = @_.perlvar- ειδικές μεταβλητές που μια sub θα διαβάσει ή θα γράψει:@_,$_,$@,$AUTOLOAD.perlfunc- τα ρήματα του συστήματος υπορουτινών:sub,return,caller,wantarray,prototype,goto,my,our,state,local.Αντικειμενοστραφής προγραμματισμός - subs ως μέθοδοι, ο ρόλος του
bless, αποστολή μέσω@ISA, η σύγχρονη σύνταξηuse experimental 'class'.