Διάφορα

reset#

Καθαρίζει κάθε μεταβλητή πακέτου της οποίας το όνομα ξεκινά με ένα από ένα σύνολο γραμμάτων, και επανοπλίζει αντιστοιχίσεις μίας εκτέλεσης m?pattern?.

Η reset είναι κατάλοιπο από τον κόσμο της Perl 4 που είχε μόνο καθολικές. Σε σύγχρονο κώδικα επιβιώνει σε δύο στενούς ρόλους: επανόπλιση των regexes μίας αντιστοιχίας m?...? ώστε να πυροδοτηθούν ξανά, και - στο τέλος του μπλοκ continue ενός βρόχου - εκκαθάριση μιας παρτίδας μεταβλητών πακέτου πριν την επόμενη επανάληψη. Η εμβέλειά της περιορίζεται στο τρέχον πακέτο και στις μεταβλητές πακέτου· οτιδήποτε δηλωμένο με my παραμένει ανέπαφο.

Σύνοψη#

reset EXPR
reset

Το EXPR είναι συμβολοσειρά που ερμηνεύεται ως σύνολο μεμονωμένων χαρακτήρων, με τις παύλες να επιτρέπονται ως εύρη: 'X', 'a-z', 'abc', 'A-Za-z'. Κάθε βαθμωτό, πίνακας, και πίνακας κατακερματισμού στο τρέχον πακέτο του οποίου το όνομα ξεκινά με ένα από αυτά τα γράμματα επαναφέρεται στην παρθένα, μη ορισμένη κατάστασή του.

Χωρίς όρισμα, μόνο οι αναζητήσεις μίας αντιστοιχίας m?pattern? στο τρέχον πακέτο επανοπλίζονται - οι μεταβλητές δεν αγγίζονται.

Τι επιστρέφεται#

Πάντα 1. Η τιμή επιστροφής δεν φέρει σήμα επιτυχίας· δεν υπάρχει κάτι στο οποίο η reset να μπορεί να αποτύχει.

Καθολική κατάσταση που επηρεάζει#

  • Κάθε μεταβλητή πακέτου στο τρέχον πακέτο της οποίας το όνομα ξεκινά με ένα από τα παρατιθέμενα γράμματα: βαθμωτά, πίνακες, και πίνακες κατακερματισμού όλα μαζί. Τα βαθμωτά γίνονται undef, οι πίνακες και οι πίνακες κατακερματισμού γίνονται κενοί.

  • Regexes μίας αντιστοιχίας (m?pattern?) μεταγλωττισμένα στο τρέχον πακέτο - η σημαία τους «ήδη αντιστοιχήθηκε» καθαρίζεται ώστε η επόμενη αποτίμηση να αντιστοιχίζει ξανά.

  • Δεν διασχίζει όρια πακέτων. Η reset 'X' μέσα σε package Foo αφήνει την $Bar::X ήσυχη.

  • Δεν αγγίζει λεξιλογικές. Οι my $x και our $x συμπεριφέρονται διαφορετικά εδώ: η our είναι ψευδώνυμο προς τη μεταβλητή πακέτου και επαναφέρεται· η my όχι.

Παραδείγματα#

Επανόπλιση όλων των αντιστοιχίσεων μίας εκτέλεσης στο τρέχον πακέτο - η τυπική σύγχρονη χρήση της reset:

reset;

Καθαρισμός κάθε μεταβλητής πακέτου που ξεκινά με X στο τρέχον πακέτο:

package Stats;
our $Xtotal = 0;
our @Xsamples = (1, 2, 3);
our %Xindex = (a => 1);
reset 'X';
# $Xtotal, @Xsamples, %Xindex are all emptied

Επαναφορά στο τέλος ενός βρόχου ώστε η επόμενη επανάληψη να ξεκινήσει καθαρή:

while (more_work()) {
    process();
} continue {
    reset 'abc';   # wipe $a*, @b*, %c* package vars for next pass
}

Εύρος χαρακτήρων - μόνο μεταβλητές με πεζά:

reset 'a-z';

Συνδυασμός μεμονωμένων γραμμάτων και ευρών:

reset 'a-cXY';    # a, b, c, X, Y

Οριακές περιπτώσεις#

  • Η reset χωρίς όρισμα δεν αγγίζει καθόλου μεταβλητές. Επανοπλίζει αντιστοιχίσεις μίας εκτέλεσης m?...? στο τρέχον πακέτο και τίποτα άλλο. Αν θέλετε να καθαρίσετε μεταβλητές πρέπει να περάσετε όρισμα.

  • Οι λεξιλογικές είναι αόρατες στη reset. Η my $Xtotal παραμένει εντελώς ανεπηρέαστη από την reset 'X'· μόνο η μεταβλητή πακέτου $Xtotal επηρεάζεται. Κώδικας που μετανάστευσε από our/καθολικές πακέτου σε my θα διαπιστώσει ότι η reset έχει σιωπηλά γίνει no-op για αυτές τις μεταβλητές.

  • Η reset 'A-Z' είναι παγίδα. Στο πακέτο main αυτό σβήνει τα @ARGV, @INC, %ENV και κάθε άλλη κεφαλαία καθολική, σχεδόν σίγουρα όχι αυτό που σκόπευε ο κώδικας.

  • Τα βαθμωτά, οι πίνακες και οι πίνακες κατακερματισμού μοιράζονται έναν χώρο ονομάτων εδώ. Η reset 'X' καθαρίζει κάθε μεταβλητή κάθε sigil της οποίας το όνομα ξεκινά με X, όχι μόνο βαθμωτά. Δεν υπάρχει τρόπος να περιοριστεί η επαναφορά σε ένα μόνο sigil.

  • Το τρέχον πακέτο αποφασίζεται κατά τη μεταγλώττιση μέσω της περικλείουσας δήλωσης package, όχι από τον καλούντα. Μια κλήση reset μέσα σε άρθρωμα καθαρίζει τις μεταβλητές αυτού του αρθρώματος, όχι του καλούντος.

  • Καμία μορφή ορίσματος regex. Η reset δέχεται συμβολοσειρά γραμμάτων, όχι regex ή λίστα ονομάτων. Δεν μπορείτε να γράψετε reset qr/^X/ ή reset '$Xtotal' - το δεύτερο προσπαθεί να επαναφέρει μεταβλητές που ξεκινούν με $, X, t, o, a, l, κάτι που σχεδόν ποτέ δεν είναι αυτό που σκόπευε ο συγγραφέας.

Διαφορές από το upstream#

  • Η reset του pperl είναι no-op - η κλήση αναλύεται, επιστρέφει 1, και δεν έχει παρενέργειες. Οι μεταβλητές πακέτου δεν καθαρίζονται και η κατάσταση μίας αντιστοιχίας m?pattern? δεν παρακολουθείται. Κώδικας που βασίζεται στην reset για να σβήσει μια παρτίδα καθολικών στο τέλος ενός βρόχου, ή για να ξαναπυροδοτήσει regex μίας αντιστοιχίας, δεν θα δει αυτή τη συμπεριφορά υπό το pperl. Προτιμήστε my και συνηθισμένες m// regexes - και τα δύο λειτουργούν πανομοιότυπα σε pperl και upstream, και αποτελούν το συνιστώμενο ιδίωμα και upstream.

Δείτε επίσης#

  • my - λεξιλογικές μεταβλητές· προτιμώμενες σε όλο τον νέο κώδικα και ανεπηρέαστες από την reset

  • local - δυναμικά οριοθετημένη αποθήκευση/επαναφορά μεταβλητής πακέτου, η συνηθισμένη απάντηση όταν θέλετε προσωρινή αλλαγή χωρίς χειροκίνητο καθαρισμό

  • m - η κανονική μορφή m//· η m?...? είναι η παραλλαγή μίας εκτέλεσης που επανοπλίζει η reset

  • continue - μπλοκ τέλους βρόχου όπου τυπικά τοποθετείται η μαζική επαναφορά της κατάστασης επανάληψης

  • package - δηλώνει σε ποιου πακέτου τις μεταβλητές θα λειτουργήσει η reset

  • undef - καθαρισμός μίας κατονομασμένης μεταβλητής, η εναλλακτική ανά μεταβλητή έναντι μιας ευρείας reset