no#
Η αντίστροφη της use κατά τη μεταγλώττιση - καλεί τη μέθοδο unimport ενός αρθρώματος για να απενεργοποιήσει ό,τι ενεργοποίησε η use.
Το no MODULE LIST αντιμετωπίζεται από τον αναλυτή ακριβώς όπως το use MODULE LIST, εκτός του ότι καλεί MODULE->unimport(LIST) αντί για MODULE->import(LIST). Και τα δύο εκτελούνται κατά τη μεταγλώττιση, και τα δύο έχουν λεξιλογική εμβέλεια, και τα δύο απαιτούν το άρθρωμα να είναι ήδη φορτωμένο. Η συνηθισμένη περίπτωση είναι η απενεργοποίηση μιας pragma μέσα σε ένα μπλοκ - no strict 'refs', no warnings 'uninitialized', no feature 'switch' - χωρίς να θιγεί το περικλείον αρχείο.
Σύνοψη#
no MODULE LIST
no MODULE
no MODULE VERSION LIST
no MODULE VERSION
Τι επιστρέφεται#
Η no είναι δήλωση, όχι έκφραση. Δεν έχει χρήσιμη τιμή επιστροφής και δεν μπορεί να εμφανιστεί όπου αναμένεται τιμή. Το αποτέλεσμα είναι παρενέργεια στην κατάσταση μεταγλώττισης της περικλείουσας λεξιλογικής εμβέλειας.
Πώς αναπτύσσεται#
Ο αναλυτής ξαναγράφει
no MODULE LIST;
στο κατά προσέγγιση ισοδύναμο του
BEGIN {
require MODULE;
MODULE->unimport(LIST);
}
the same shape as
use, withunimportswapped in forimport. Consequences that follow from this:Χρόνος μεταγλώττισης. Το μπλοκ
BEGINεκτελείται μόλις ο αναλυτής φτάσει στη δήλωσηno, πριν μεταγλωττιστεί οποιοσδήποτε επόμενος κώδικας στο αρχείο. Αυτός είναι ο λόγος που τοno strict 'refs'τίθεται σε ισχύ στις δηλώσεις που το ακολουθούν στο ίδιο αρχείο, όχι κατά τον χρόνο εκτέλεσης.Λεξιλογική εμβέλεια. Pragmas που τιμούν τη λεξιλογική εμβέλεια (
strict,warnings,feature,integer,utf8, και οι άλλες pragmas του πυρήνα) βλέπουν το αποτέλεσμα «off» να περιορίζεται στο εσώτατο περικλείον μπλοκ,evalή αρχείο. Η έξοδος από το μπλοκ επαναφέρει την προηγούμενη κατάσταση.Το
requireεξακολουθεί να συμβαίνει. Ηno MODULEφορτώνει τοMODULEαν δεν έχει ήδη φορτωθεί, και μετά καλεί τηνunimportσε αυτό. Δεν χρειάζεστε αντίστοιχηuseνωρίτερα στο αρχείο.Η
unimportείναι υποχρεωτική. Αν το πακέτο δεν έχει μέθοδοunimport, η κλήση πεθαίνει κατά τη μεταγλώττιση μεCan't locate object method "unimport" via package "MODULE". Τα περισσότερα μη-pragma αρθρώματα δεν ορίζουνunimport- ηnoείναι στην πραγματικότητα χρήσιμη μόνο για αρθρώματα που τη διαφημίζουν.
Παραδείγματα#
Απενεργοποίηση μιας μεμονωμένης κατηγορίας προειδοποιήσεων μέσα σε μπλοκ:
use warnings;
for my $row (@rows) {
no warnings 'uninitialized';
print join(",", @$row), "\n"; # empty fields render as ""
}
# 'uninitialized' warnings are back on here
Χαλάρωση της strict 'refs' για μία δήλωση που χρειάζεται συμβολική αποαναφορά:
use strict;
sub install {
my ($name, $code) = @_;
no strict 'refs';
*{"main::$name"} = $code; # symbolic typeglob assignment
}
Απενεργοποίηση προειδοποίησης πειραματικού χαρακτηριστικού ενώ χρησιμοποιείται το χαρακτηριστικό:
use feature 'signatures';
no warnings 'experimental::signatures';
sub greet ($who) { "hello, $who\n" }
Επαναφορά ενός προεπιλεγμένου πακέτου χαρακτηριστικών σε σκέτη σημασιολογία Perl:
use v5.36; # enables strict, warnings, say, signatures…
no feature 'switch'; # …but not given/when
Απενεργοποίηση pragma χρήστη που παρέχει δική της unimport:
use My::Pragma qw(loud);
{
no My::Pragma; # My::Pragma->unimport called here
quiet_code();
}
Οριακές περιπτώσεις#
Το
no VERSIONείναι σφάλμα μεταγλώττισης. Ηuse VERSIONυπάρχει ως έλεγχος έκδοσης κατά τη μεταγλώττιση έναντι του εκτελούμενου διερμηνέα· δεν υπάρχει συνετή αντίστροφη, οπότε τοno 5.36;πεθαίνει μεNo such class 5.36. Ο έλεγχος έκδοσης πηγαίνει μόνο προς μία κατεύθυνση.Το
no MODULE VERSIONόντως αναλύεται. Απαιτεί τοMODULEνα είναι τουλάχιστον στην έκδοσηVERSION(ίδιος έλεγχος με τηνuse), και μετά καλείMODULE->unimport(LIST). Ο έλεγχος έκδοσης αφορά το φορτωμένο άρθρωμα, όχι τον διερμηνέα.Άρθρωμα χωρίς
unimport. Πεθαίνει κατά τη μεταγλώττιση. Δεν υπάρχει εφεδρεία σε no-op· αν γράφετε άρθρωμα και θέλετε ηnoνα είναι σιωπηρό no-op, ορίστε μια κενήsub unimport {}.Μόνο bareword
MODULE. Όπως και στηνuse, το όνομα αρθρώματος πρέπει να είναι bareword γνωστό κατά τη μεταγλώττιση. Τοno $name;είναι συντακτικό σφάλμα - ο αναλυτής χρειάζεται το κυριολεκτικό διακριτικό για να αποφασίσει ποιαunimportνα καλέσει.Δεν αναιρεί την
use. Ηno FooκαλείFoo->unimport, η οποία κατά σύμβαση αντιστρέφει ό,τι έκανε ηFoo->importστην τρέχουσα λεξιλογική εμβέλεια - αλλά αυτό είναι σύμβαση, όχι εγγύηση της γλώσσας. Μια αμελήςunimportμπορεί να αφήσει κατάσταση πίσω της, και οι παρενέργειες απόrequire Foo(μπλοκ BEGIN, hooks@INC, εγκατεστημένες subs σε άλλα πακέτα) δεν αναιρούνται.Το αποτέλεσμα τελειώνει στο περικλείον μπλοκ. Για λεξιλογικές pragmas, η κατάσταση «off» σταματάει στο επόμενο
}, στο όριοevalή στο τέλος του αρχείου. Κώδικας σε διαφορετικό αρχείο που κάνειrequireήuseαυτό εδώ δεν επηρεάζεται.Οι
import/unimportείναι απλώς κλήσεις μεθόδων. ΗMODULE->unimport(LIST)εκτελείται ακριβώς όπως οποιαδήποτε άλλη μέθοδος κλάσης - βλέπει τοMODULEως πρώτο όρισμα και τηLISTμετά. Η μέθοδος μπορεί να επιθεωρήσει τον καλούντα μέσωcallerγια να βρει ποιο πακέτο πρέπει να τροποποιήσει.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
use- η θετική μορφή· ηnoείναι κυριολεκτικάuseμεunimportστη θέση τηςimportrequire- το βήμα φόρτωσης κατά τον χρόνο εκτέλεσης που εκτελεί ηnoπριν καλέσει τηνunimportpackage- δηλώνει το τρέχον πακέτο, που είναι η εμβέλεια που τυπικά τροποποιεί ηunimportμιας pragmaimport- η συμβατική αντίστροφη μέθοδος· ηnoκαλείunimport, ηuseκαλείimportBEGIN- η φάση μεταγλώττισης στην οποία τρέχει ηnocaller- πώς μια μέθοδοςunimportαναγνωρίζει το πακέτο που πρέπει να επηρεάσει