Κανονικές εκφράσεις και αντιστοίχιση μοτίβων
study#
Ένα no-op που διατηρείται για συμβατότητα πηγαίου κώδικα με παλαιότερο κώδικα Perl.
Η study δέχεται ένα βαθμωτό όρισμα (ή λειτουργεί στο $_ όταν καλείται χωρίς όρισμα) και δεν κάνει τίποτα με αυτό. Η κλήση είναι έγκυρη, το όρισμα αποτιμάται, και ο έλεγχος επιστρέφει αμέσως. Δεν χτίζεται κανένα ευρετήριο, δεν τροποποιείται καμία κατάσταση της μηχανής regex, καμία μεταγενέστερη αντιστοίχιση δεν εκτελείται γρηγορότερα ή πιο αργά εξαιτίας της.
Το όνομα επιβιώνει επειδή δεκαετίες κώδικα Perl - βιβλία, FAQ, διανομές CPAN, εσωτερικά scripts - πασπαλίζουν study μπροστά από μακριές συμβολοσειρές που πρόκειται να αντιστοιχιστούν με πολλά μοτίβα. Αυτά τα προγράμματα εξακολουθούν να μεταγλωττίζονται και εξακολουθούν να τρέχουν. Απλώς δεν λαμβάνουν πλέον τη βελτιστοποίηση που κάποτε υποσχόταν η δεσμευμένη λέξη.
Σύνοψη#
study SCALAR
study
Τι επιστρέφεται#
Πάντα 1. Η τιμή επιστροφής δεν τεκμηριώνεται ως χρήσιμη και κανένας ιδιωματικός κώδικας δεν την επιθεωρεί. Αντιμετωπίστε τη study ως μη επιστρέφουσα κάτι άξιο αποτύπωσης.
Ιστορικό#
Μέχρι το Perl 5.14 η study έχτιζε ένα αντεστραμμένο ευρετήριο των bytes στο SCALAR, και μετά προκαταλάμβανε τη μηχανή regex ώστε να αγκυρώνει κάθε επόμενη αντιστοίχιση στον σπανιότερο χαρακτήρα του μοτίβου (η σπανιότητα εκτιμώταν από έναν στατικό πίνακα συχνοτήτων ψημένο μέσα στον διερμηνευτή). Ο επιδιωκόμενος φόρτος εργασίας ήταν «μία μακριά συμβολοσειρά, πολλά m// εναντίον της»: το ευρετήριο αποσβέστηκε στις αντιστοιχίσεις.
Η βελτιστοποίηση αφαιρέθηκε στο Perl 5.16. Αλληλεπιδρούσε άσχημα με το Unicode, το casefold /i, και τη μετά-την-5.10 μηχανή regex, και το κόστος συντήρησης είχε από καιρό ξεπεράσει τον στενό φόρτο εργασίας που βοηθούσε. Η δεσμευμένη λέξη διατηρήθηκε ως no-op ώστε ο υπάρχων πηγαίος κώδικας να συνεχίσει να μεταγλωττίζεται.
Παραδείγματα#
Παλαιό ιδίωμα - εξακολουθεί να μεταγλωττίζεται, δεν έχει πια κανένα αποτέλεσμα:
study $big_text;
while ($big_text =~ /$pattern/g) {
# ...
}
Χωρίς όρισμα - εφαρμόζεται στο $_, επίσης no-op:
for (@lines) {
study;
print if /error/;
}
Καθοδήγηση αντικατάστασης: αν ο αρχικός κώδικας στηριζόταν στη study για ταχύτητα, η σύγχρονη απάντηση είναι να μεταγλωττίσετε το μοτίβο μία φορά με qr και να το επαναχρησιμοποιήσετε, ή να αναδιαρθρώσετε τον κώδικα ώστε η επαναλαμβανόμενη εργασία να είναι από την πλευρά του μοτίβου, όχι από την πλευρά της συμβολοσειράς:
my $re = qr/$pattern/;
for my $line (@lines) {
print $line if $line =~ $re;
}
Οριακές περιπτώσεις#
Κανένα αποτέλεσμα στην επίδοση των regex. Η αφαίρεση κάθε κλήσης
studyαπό ένα πρόγραμμα δεν αλλάζει τίποτα παρατηρήσιμο, ούτε τους χρόνους πέρα από τον θόρυβο της μέτρησης.Το όρισμα αποτιμάται ούτως ή άλλως. Το
study some_expensive_call()εκτελεί τηνsome_expensive_call()για τις παρενέργειες και την τιμή επιστροφής της, και μετά απορρίπτει το αποτέλεσμα. Αυτό σχεδόν ποτέ δεν είναι αυτό που σκόπευε ο συγγραφέας.Καμία προειδοποίηση κατά τη χρήση. Η
studyδεν προειδοποιεί υπόuse warningsκαι δεν είναι παρωχημένη, οπότε ένα linter είναι ο μοναδικός τρόπος να σημανθούν παλιές εμφανίσεις σε μια βάση κώδικα.Δεν είναι pragma, δεν είναι hint. Η
studyείναι κανονική ενσωματωμένη έκφραση. Δεν διατηρείται σε όλες τις δηλώσεις και δεν υπάρχει κατάσταση «studied» προσκολλημένη στο βαθμωτό.Tainting και magic μένουν ανέγγιχτα. Το
study $taintedδεν ξεπλένει taint, δεν πυροδοτείFETCHσε tied βαθμωτό περισσότερο απ” ό,τι μια απλή ανάγνωση, και δεν σημειώνει το βαθμωτό με κανέναν τρόπο.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42. Η study είναι no-op και στα δύο.
Δείτε επίσης#
qr- μεταγλωττίζει ένα μοτίβο μία φορά και επαναχρησιμοποιεί τη μεταγλωττισμένη μορφή· αυτή είναι η σύγχρονη απάντηση στο «κάντε πολλές αντιστοιχίσεις στο ίδιο κείμενο γρηγορότερα»m- ο τελεστής αντιστοίχισης του οποίου την επίδοση επηρέαζε κάποτε ηstudyindex- αναζήτηση σταθερής συμβολοσειράς, γρηγορότερη από regex όταν το μοτίβο είναι κυριολεκτική υπο-συμβολοσειράpos- πού άφησε η τελευταία αντιστοίχιση/g, σχετικό με τον φόρτο εργασίας «μία μακριά συμβολοσειρά, πολλές αντιστοιχίσεις» που κάποτε στόχευε ηstudy