Υπορουτίνες#

Μια υπορουτίνα είναι ένα κατονομασμένο (ή ανώνυμο) μπλοκ κώδικα που δέχεται μια λίστα ορισμάτων, εκτελείται σε μια νέα λεξιλογική εμβέλεια, και επιστρέφει μια λίστα τιμών. Οι υπορουτίνες είναι η μονάδα επαναχρησιμοποίησης στην Perl, η μονάδα αποστολής για αντικειμενοστραφή κώδικα, και - μέσω closures

  • η μονάδα ενθυλάκωσης με κατάσταση. Σχεδόν τα πάντα στη γλώσσα είναι χτισμένα πάνω τους.

PetaPerl implements the full Perl 5.44 subroutine model: the classic @_-based calling convention, modern signatures, the prototype mechanism that controls call-site parsing, lexical and package scoping (my, our, local, state), closures, the attribute system (:lvalue, :method, :prototype(...)), recursion with goto &sub tail calls, and the special compile-time and run-time blocks (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;
}

Both are fully supported. Signatures are not a replacement for @_; they are an additional, more declarative entry into the same calling convention. Inside a signature-using sub, @_ is still populated (this is implementation-defined and discouraged to rely on, but it is the case in 5.44).

Ο διαχωρισμός μεταξύ κλασικού και σύγχρονου είναι η πιο χρήσιμη πυξίδα προσανατολισμού όταν διαβάζετε κώδικα 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'.