Αρθρώματα

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, with unimport swapped in for import. 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 στη θέση της import

  • require - το βήμα φόρτωσης κατά τον χρόνο εκτέλεσης που εκτελεί η no πριν καλέσει την unimport

  • package - δηλώνει το τρέχον πακέτο, που είναι η εμβέλεια που τυπικά τροποποιεί η unimport μιας pragma

  • import - η συμβατική αντίστροφη μέθοδος· η no καλεί unimport, η use καλεί import

  • BEGIN - η φάση μεταγλώττισης στην οποία τρέχει η no

  • caller - πώς μια μέθοδος unimport αναγνωρίζει το πακέτο που πρέπει να επηρεάσει