Εμβέλεια · Αρθρώματα · Κλάσεις και αντικειμενοστρέφεια
use#
Φορτώνει ένα άρθρωμα κατά τη μεταγλώττιση και εισάγει τα σύμβολά του στο τρέχον πακέτο.
Η use είναι ο καθημερινός μηχανισμός για τη φόρτωση κώδικα βιβλιοθήκης. Εκτελείται κατά τη μεταγλώττιση, όχι σε χρόνο εκτέλεσης: το κατονομαζόμενο άρθρωμα εντοπίζεται στο @INC, φορτώνεται (αν δεν είναι ήδη στο %INC), και του δίνεται η ευκαιρία να αλλοιώσει τον χώρο ονομάτων του καλούντος - τυπικά ψευδωνυμοποιώντας ονόματα υπορουτινών ή μεταβλητών μέσα σε αυτόν. Η ίδια σύνταξη οδηγεί επίσης τις pragmas (οδηγίες του μεταγλωττιστή όπως οι strict ή warnings)· η μόνη διαφορά είναι σύμβαση - οι pragmas γράφονται με πεζά και συνήθως έχουν λεκτικές επιδράσεις, όχι σε όλο το πακέτο.
Μια δήλωση use ορίζεται ως ακριβώς ισοδύναμη με:
BEGIN { require Module; Module->import(LIST); }
Το BEGIN εξαναγκάζει τη φόρτωση και την εισαγωγή να συμβούν ενώ το περιβάλλον αρχείο αναλύεται ακόμη, ώστε τα εισαγόμενα ονόματα να είναι ορατά στον μεταγλωττιστή για το υπόλοιπο του αρχείου.
Σύνοψη#
use Module VERSION LIST
use Module VERSION
use Module LIST
use Module
use Module ()
use VERSION
Τι επιστρέφεται#
Η use είναι δήλωση, όχι έκφραση - δεν έχει χρήσιμη τιμή επιστροφής και δεν μπορεί να εμφανιστεί στη δεξιά πλευρά κανενός. Η επίδρασή της είναι παρενέργεια στην τρέχουσα μονάδα μεταγλώττισης: το %INC αποκτά εγγραφή, το εισάγον πακέτο αποκτά όποια σύμβολα ψευδωνυμοποίησε η import, και - για την use VERSION - η τρέχουσα λεκτική εμβέλεια αποκτά ένα ενεργοποιημένο πακέτο χαρακτηριστικών.
Αν το άρθρωμα δεν μπορεί να φορτωθεί, ή αν η import πεθάνει, το μπλοκ BEGIN διαδίδει την εξαίρεση και η μεταγλώττιση ματαιώνεται.
Οι τέσσερις μορφές για άρθρωμα#
use Module#
Φορτώνει το άρθρωμα και καλεί τη μέθοδο import του χωρίς ορίσματα. Το άρθρωμα αποφασίζει τι σημαίνει «χωρίς ορίσματα»· για αρθρώματα βασισμένα στον Exporter τυπικά σημαίνει «εξάγαγε τις προεπιλογές @EXPORT σου»:
use File::Spec; # calls File::Spec->import()
use Module LIST#
Φορτώνει το άρθρωμα και καλεί την import με LIST:
use List::Util qw(first sum max);
Αυτή είναι η συνηθισμένη μορφή «εισήγαγε ακριβώς αυτά τα ονόματα». Η LIST διαβιβάζεται αυτούσια στην import· το νόημά της είναι υπόθεση του αρθρώματος, όχι της γλώσσας.
use Module ()#
Οι κενές παρενθέσεις απενεργοποιούν εντελώς την κλήση της import. Αυτό διαφέρει από την παράλειψη της λίστας - δεν καλείται καθόλου η μέθοδος import:
use POSIX (); # load, but do not import anything
POSIX::strftime(...); # call by full name instead
Ισοδύναμο με:
BEGIN { require POSIX }
Χρησιμοποιήστε το όταν θέλετε το άρθρωμα φορτωμένο αλλά δεν θέλετε να αλλοιωθεί ο χώρος ονομάτων σας - τυπικά επειδή θα καλείτε τα πάντα με πλήρως κατονομασμένο όνομα, ή επειδή οι προεπιλεγμένες εξαγωγές του αρθρώματος θα αλλοίωναν κάτι που σας ενδιαφέρει.
use Module VERSION / use Module VERSION LIST#
Όταν μια VERSION εμφανίζεται αμέσως μετά το Module (χωρίς κόμμα), η use καλεί τη μέθοδο VERSION του αρθρώματος με αυτή την έκδοση ως όρισμα πριν καλέσει την import:
use List::Util 1.45 qw(uniq);
είναι ισοδύναμο με:
BEGIN {
require List::Util;
List::Util->VERSION(1.45);
List::Util->import(qw(uniq));
}
Η προεπιλεγμένη μέθοδος VERSION, κληρονομημένη από το UNIVERSAL, κράζει αν η ζητούμενη έκδοση είναι μεγαλύτερη από την $Module::VERSION.
Η VERSION πρέπει να μοιάζει με κυριολεκτικό έκδοσης - ψηφίο, ή v ακολουθούμενο από ψηφίο. Αυθαίρετες εκφράσεις σε αυτή τη θέση αναλύονται ως αρχή της LIST, όχι ως έκδοση. Σημειώστε ότι δεν υπάρχει κόμμα μετά τη VERSION.
use VERSION - αίτημα για επίπεδο γλώσσας Perl#
Η use VERSION (χωρίς όνομα αρθρώματος) δηλώνει την ελάχιστη έκδοση Perl που απαιτεί το αρχείο, και ενεργοποιεί λεκτικά το αντίστοιχο πακέτο χαρακτηριστικών:
use v5.36; # v-string form - preferred
use 5.036; # numeric form - equivalent
use 5.036_000; # older numeric form
Εγείρεται εξαίρεση κατά τη μεταγλώττιση αν η τρέχουσα Perl είναι παλαιότερη από τη VERSION· το υπόλοιπο του αρχείου δεν αναλύεται καν.
Πέρα από τον έλεγχο έκδοσης, η use VERSION ενεργοποιεί τα χαρακτηριστικά που συνοδεύουν αυτή την έκδοση:
use v5.12ή ανώτερη - υπονοούμενοuse strict.use v5.35ή ανώτερη - υπονοούμενοuse warnings.use v5.36- η συνηθισμένη σύγχρονη βάση: προσθέτει ταsay,signatures,isa, και τα χαρακτηριστικά των προηγούμενων πακέτων.use v5.39ή ανώτερη - εισάγει λεκτικά συναρτήσειςbuiltinγια το αντίστοιχο πακέτο.use v5.41ή ανώτερη - ενεργοποιεί τηνsource::encoding 'ascii'.
Η use VERSION δεν φορτώνει τα feature.pm, strict.pm, warnings.pm, ή builtin.pm - υλοποιεί την ισοδύναμη συμπεριφορά απευθείας. Τοποθετήστε την στην αρχή του αρχείου, πριν από οτιδήποτε εξαρτάται από την ενεργοποίηση αυτών των χαρακτηριστικών.
Από την Perl 5.39 και μετά, η έκδοση δεύτερης use VERSION ενώ μία είναι ήδη ενεργή είναι μοιραίο σφάλμα. Σε παλαιότερα πακέτα ήταν απλώς αποθαρρυμένη.
Αρθρώματα έναντι pragmas#
Συντακτικά, οι pragmas και τα αρθρώματα είναι πανομοιότυπα - και τα δύο είναι απλώς πακέτα των οποίων τη μέθοδο import επικαλείστε μέσω use. Οι συμβατικές διαφορές:
Ονοματοδοσία. Οι pragmas γράφονται με πεζά (
strict,warnings,feature,integer)· τα αρθρώματα είναιStudly::Caps.Εμβέλεια της επίδρασης. Οι pragmas συνήθως αλλοιώνουν την τρέχουσα λεκτική εμβέλεια (ένα μπλοκ, όχι πακέτο) και ξετυλίγονται στο κλείσιμο της αγκύλης. Τα αρθρώματα συνήθως αλλοιώνουν το τρέχον πακέτο και παραμένουν μέχρι το τέλος του αρχείου.
no. Η αντίστοιχη δήλωσηnoκαλεί τηνunimportαντί τηςimport. Οι pragmas τυπικά υλοποιούν τηνunimportγια να αναιρούν την επίδρασή τους· τα περισσότερα συνηθισμένα αρθρώματα όχι.
use strict; # lexical - affects this block / file
use warnings; # lexical
{
no warnings 'uninitialized';
# warnings off only in this block
}
use List::Util qw(sum); # package-scoped - affects main::
Υπό συνθήκη φόρτωση#
Επειδή η use εκτελείται κατά τη μεταγλώττιση, αγνοεί τη συνηθισμένη ροή ελέγχου χρόνου εκτέλεσης. Μια use μέσα στην ψευδή διακλάδωση ενός if εκτελείται ούτως ή άλλως:
if (0) {
use Heavy::Module; # loaded anyway - compile time!
}
Για πραγματικά υπό συνθήκη φόρτωση, χρησιμοποιήστε είτε την require σε χρόνο εκτέλεσης, είτε αναθέστε την στην pragma if:
use if $] >= 5.036, 'experimental', 'builtin';
use if $^O eq 'MSWin32', 'Win32::API';
Παραδείγματα#
Φόρτωση αρθρώματος με τις προεπιλεγμένες του εξαγωγές:
use Carp; # croak, carp, confess visible here
Εισαγωγή συγκεκριμένου υποσυνόλου:
use List::Util qw(first min max sum);
Φόρτωση χωρίς εισαγωγή - κλήση με πλήρες όνομα:
use Scalar::Util ();
my $ok = Scalar::Util::looks_like_number($x);
Απαίτηση ελάχιστης έκδοσης αρθρώματος:
use Moo 2.000000;
Δήλωση του επιπέδου γλώσσας Perl και απόκτηση του πακέτου χαρακτηριστικών του:
use v5.36; # strict, warnings, say, signatures...
sub greet ($name) {
say "hello, $name";
}
Ενεργοποιήστε μια pragma για ένα αρχείο, στη συνέχεια απενεργοποιήστε την για ένα μπλοκ:
use warnings;
sub legacy_parser {
no warnings 'uninitialized';
return join ",", @_; # undefs render as "" without warnings
}
Υπό συνθήκη pragma μέσω του βοηθού if:
use if $] < 5.010, 'MRO::Compat';
Οριακές περιπτώσεις#
Το
Moduleπρέπει να είναι bareword. Τοuse $name;είναι συντακτικό σφάλμα - ηuseδεν δέχεται έκφραση χρόνου εκτέλεσης για το όνομα αρθρώματος. Χρησιμοποιήστε τηνrequireγι” αυτό.Κανένα κόμμα μεταξύ
Moduleκαι VERSION. Τοuse List::Util 1.45είναι έλεγχος έκδοσης· τοuse List::Util, 1.45είναι συντακτικό σφάλμα.Ο κανόνας του κυριολεκτικού έκδοσης είναι αυστηρός. Οτιδήποτε δεν ξεκινά με ψηφίο ή με
vακολουθούμενο από ψηφίο αναλύεται ως αρχή τηςLIST, όχι ως έκδοση. Τοuse Module "1.45"διαβιβάζει τη συμβολοσειρά"1.45"στηνimport· δεν ελέγχει έκδοση.Κενή
LISTέναντι παραλειπόμενηςLIST. Τοuse Module;καλεί τηνModule->import(). Τοuse Module ();δεν καλεί καθόλου τηνimport. Η διάκριση έχει σημασία για αρθρώματα των οποίων ηimportέχει παρενέργειες ακόμη και χωρίς ορίσματα.Λείπει η μέθοδος
import. Αν το άρθρωμα δεν ορίζει (και δεν κληρονομεί) μέθοδοimport, η κλήση παρακάμπτεται σιωπηλά - κανένα σφάλμα, ακόμη και αν είναι ορισμένη ηAUTOLOAD.useμέσα σεeval. ΤοBEGINεκτελείται κατά τη μεταγλώττιση του κώδικα τηςeval, οπότε τοeval "use Some::Module"καθυστερεί τη φόρτωση μέχρι να τρέξει ηeval. Αυτός είναι ο συνηθισμένος τρόπος για ανίχνευση ενός προαιρετικού αρθρώματος σε χρόνο εκτέλεσης:eval { require Some::Module; Some::Module->import }; my $have_it = !$@;
Σειρά της
use VERSIONκαι άλλων pragmas. Τοποθετήστε τηνuse VERSIONπρώτη, ώστε το πακέτο χαρακτηριστικών να είναι σε ισχύ πριν τρέξουν επόμενες pragmas (που μπορεί να εξαρτώνται από αυτό). Ένα μεταγενέστεροno strict 'refs'εξακολουθεί να υπερισχύει των αυστηροτήτων που υπονοεί ηuse v5.12+, αλλά το να βασίζεται κανείς σε αυτό αποθαρρύνεται.Pragmas που μοιάζουν με αρθρώματα. Κάποιες pragmas διανέμονται με όνομα σε κεφαλαία (
UNIVERSAL,Internals)· κάποια αρθρώματα διανέμονται με πεζά (if,lib,ok). Η σύμβαση ονοματοδοσίας είναι ένδειξη, όχι κανόνας - αυτό που έχει σημασία είναι το τι κάνει ηimportτου αρθρώματος.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
require- το χρόνου εκτέλεσης μισό τηςuse· φορτώνει άρθρωμα χωρίς να επικαλείται τηνimport, και δέχεται έκφραση χρόνου εκτέλεσης για το όνομα του αρθρώματοςno- η αντίστοιχη δήλωση· καλεί τηνunimportαντί τηςimportγια να αναιρέσει την επίδραση μιας pragmaimport- δεν είναι ενσωματωμένη· συνηθισμένη μέθοδος κλάσης που επικαλείται ηuse, συνήθως παρεχόμενη μέσω κληρονομικότητας από τονExporterpackage- δηλώνει το πακέτο του οποίου τον χώρο ονομάτων θα αλλοιώσει ηuse@INC- η λίστα καταλόγων που ερευνώνται για το αρχείο του αρθρώματος%INC- καταγράφει κάθε αρχείο που φορτώθηκε απόuseήrequire, με κλειδί τη σχετική διαδρομή