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- λεξιλογικές μεταβλητές· προτιμώμενες σε όλο τον νέο κώδικα και ανεπηρέαστες από τηνresetlocal- δυναμικά οριοθετημένη αποθήκευση/επαναφορά μεταβλητής πακέτου, η συνηθισμένη απάντηση όταν θέλετε προσωρινή αλλαγή χωρίς χειροκίνητο καθαρισμόm- η κανονική μορφήm//· ηm?...?είναι η παραλλαγή μίας εκτέλεσης που επανοπλίζει ηresetcontinue- μπλοκ τέλους βρόχου όπου τυπικά τοποθετείται η μαζική επαναφορά της κατάστασης επανάληψηςpackage- δηλώνει σε ποιου πακέτου τις μεταβλητές θα λειτουργήσει ηresetundef- καθαρισμός μίας κατονομασμένης μεταβλητής, η εναλλακτική ανά μεταβλητή έναντι μιας ευρείαςreset