Κανονικές εκφράσεις και αντιστοίχιση μοτίβων
qr//#
Μεταγλωττίζει ένα μοτίβο μία φορά και επιστρέφει ένα επαναχρησιμοποιήσιμο αντικείμενο regex.
Η qr// περικλείει σε εισαγωγικά το STRING της ως κανονική έκφραση, την παρεμβάλλει με τον ίδιο τρόπο που το κάνει η m, και επιστρέφει ένα αντικείμενο Regexp που μπορείτε να αποθηκεύσετε, να περάσετε ως όρισμα και να ενσωματώσετε σε άλλα μοτίβα. Το μεταγλωττισμένο μοτίβο μεταφέρει μαζί του τους τροποποιητές του, οπότε κάθε μεταγενέστερη χρήση βλέπει τις σημαίες με τις οποίες χτίστηκε.
Σύνοψη#
my $re = qr/STRING/;
my $re = qr/STRING/msixpodualn;
my $re = qr{STRING};
my $re = qr'STRING'; # single-quote delimiter: no interpolation
Τι επιστρέφεται#
Ένα blessed αντικείμενο Regexp. Η ref επιστρέφει τη συμβολοσειρά "Regexp". Η μετατροπή του αντικειμένου σε συμβολοσειρά παράγει μια κανονικοποιημένη μορφή του μοτίβου με τους τροποποιητές του κωδικοποιημένους σε ένα περιτύλιγμα (?flags:...), που είναι ακριβώς η μορφή που η μηχανή regex ενσωματώνει όταν το αντικείμενο παρεμβάλλεται σε άλλο μοτίβο:
my $re = qr/my.STRING/is;
print $re; # (?^si:my.STRING)
Το αντικείμενο είναι αδιαφανές - μην το αποαναφέρετε. Η μορφή ως συμβολοσειρά προορίζεται για παρεμβολή και αποσφαλμάτωση, όχι για χειροκίνητη ανάλυση.
Καθολική κατάσταση που επηρεάζει#
$1,$2, …,$+,$&,$`,$',%+,%-- δεν ορίζονται από την ίδια τηνqr//. Η μεταγλώττιση δεν αντιστοιχίζει. Αυτές συμπληρώνονται μόνο όταν το μεταγλωττισμένο μοτίβο χρησιμοποιείται αργότερα απόm,sήsplit.$@- ορίζεται αν το μοτίβο περιέχει συντακτικό σφάλμα και το σφάλμα παγιδεύεται μεeval. Ένα μη παγιδευμένο σφάλμα μεταγλώττισης εγείρει μοιραία εξαίρεση τύπουBareword "..." not allowedστο σημείο τηςqr//.Οι pragmas locale και Unicode που ισχύουν στο σημείο της
qr//(use locale,use utf8) ψήνονται μέσα στο μεταγλωττισμένο αντικείμενο. Η αλλαγή της pragma αργότερα δεν αλλάζει το αντικείμενο.
Τροποποιητές#
Όλοι οι τροποποιητές που ισχύουν για την m ισχύουν και για την qr//. Συλλαμβάνονται στο αντικείμενο που επιστρέφεται και διαδίδονται όταν το αντικείμενο παρεμβάλλεται σε άλλο μοτίβο.
Σημαία | Σημασία |
|---|---|
| Πολυγραμμικός: τα |
| Μονογραμμικός: το |
| Αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων. |
| Εκτεταμένος: οι λευκοί χαρακτήρες και τα σχόλια |
| Διατήρηση αντιστοιχίας (χωρίς αποτέλεσμα σε Perl 5.20+· τα |
| Μεταγλώττιση μία φορά· οι παρεμβαλλόμενες μεταβλητές παγώνουν στην πρώτη χρήση. Σπάνια χρειάζεται - η |
| Περιορίζει τα |
| Χρήση των κανόνων του τρέχοντος locale. |
| Χρήση κανόνων Unicode. |
| Προεπιλεγμένοι διπλοί κανόνες (legacy· συνήθως υιοθετούνται αυτόματα). |
| Μη σύλληψη: οι ανώνυμες ομάδες |
Όταν ένα μεταγλωττισμένο μοτίβο ενσωματώνεται σε μεγαλύτερο μοτίβο, οι σημαίες χαρακτηροσυνόλου και msixn με τις οποίες χτίστηκε ισχύουν μόνο για εκείνη την περιοχή. Ο τροποποιητής o είναι η μία εξαίρεση - δεν διαδίδεται.
Παραδείγματα#
Μεταγλωττίστε μία φορά, χρησιμοποιήστε πολλές. Επανάληψη σε μοτίβα χτισμένα εκ των προτέρων αποφεύγει την επαναμεταγλώττιση σε κάθε επανάληψη:
my @rules = map qr/$_/i, qw(error warn fail panic);
for my $line (@lines) {
for my $rx (@rules) {
print $line if $line =~ $rx;
}
}
Παρεμβάλετε ένα μεταγλωττισμένο μοτίβο μέσα σε άλλο μοτίβο. Το εξωτερικό μοτίβο βλέπει τις σημαίες του εσωτερικού μέσω του περιτυλίγματος (?flags:...):
my $word = qr/\w+/;
my $csv = qr/^$word(?:,$word)*$/;
"alpha,beta,gamma" =~ $csv; # matches
Οριοθέτης μονών εισαγωγικών για κυριολεκτικό μοτίβο χωρίς παρεμβολή - χρήσιμο όταν το μοτίβο περιέχει $ ή @ που πρέπει να μείνουν κυριολεκτικά:
my $price = qr'\$\d+\.\d{2}'; # matches "$1.99", not a sigil
"total: \$9.95" =~ $price; # matches
Επαναχρησιμοποίηση μοτίβου ανάμεσα σε κλήσεις. Η αποθήκευση της μεταγλωττισμένης μορφής σε ένα closure αποσβένει το κόστος μεταγλώττισης σε κάθε κλήση της επιστρεφόμενης υπορουτίνας:
sub matcher_for {
my $pat = shift;
my $rx = qr/\Q$pat\E/i; # \Q...\E quotes regex metacharacters
return sub { $_[0] =~ $rx };
}
my $is_error = matcher_for("ERROR:");
$is_error->($line);
Η σύλληψη μέσα σε παρεμβαλλόμενο qr// εξακολουθεί να συμπληρώνει το $1 τη στιγμή της αντιστοίχισης, όχι τη στιγμή της qr//:
my $num = qr/(\d+)/;
"port 8080" =~ /:$num$/;
print $1; # 8080
Χρήση του /n για καταστολή της σύλληψης στα $1, $2, … διατηρώντας τις ονομαστικές συλλήψεις διαθέσιμες:
my $rx = qr/(foo)(?<kw>bar)/n;
"foobar" =~ $rx;
print $+{kw}; # "bar"
print defined $1 ? "yes" : "no"; # "no"
Οριακές περιπτώσεις#
Καμία αντιστοίχιση κατά τη μεταγλώττιση. Η
qr//μόνο μεταγλωττίζει. Για να ελέγξετε μια συμβολοσειρά, χρησιμοποιήστε το αντικείμενο μεmή=~:$string =~ $rx.Οι παρεμβαλλόμενες μεταβλητές αποτυπώνονται τη στιγμή της
qr//, όχι τη στιγμή της χρήσης. Τοmy $rx = qr/$pat/; $pat = "other";αφήνει στο$rxτο μοτίβο που χτίστηκε από την αρχική$pat. Για επανασύλληψη, ξαναχτίστε τηνqr//.Τα σφάλματα μοτίβου κατά τη μεταγλώττιση είναι μοιραία. Το
qr/(/εγείρει εξαίρεση στο σημείο τηςqr//. Τυλίξτε σεevalόταν το μοτίβο προέρχεται από είσοδο χρήστη και ένα σφάλμα θα πρέπει να είναι ανακτήσιμο:my $rx = eval { qr/$user_input/ }; die "bad pattern: $@" if $@;
Η
ref($rx)επιστρέφει"Regexp"- όχι"SCALAR", όχι"CODE". Χρησιμοποιήστε αυτό για να ανιχνεύσετε ένα μεταγλωττισμένο μοτίβο σε πολυμορφική θέση ορίσματος:ref($arg) eq 'Regexp'.Η μετατροπή σε συμβολοσειρά είναι απωλεστική για επανανάλυση. Η κανονικοποιημένη μορφή είναι νόμιμη ως στόχος παρεμβολής αλλά δεν εγγυάται αναγνώσιμο από ανθρώπους αντίγραφο της αρχικής πηγής. Μην εφαρμόζετε
qr//ξανά στην έξοδο σε μορφή συμβολοσειράς.Ψήσιμο locale και Unicode. Μια
qr//που χτίστηκε μέσα σεuse localeσυμπεριφέρεται με κανόνες locale για πάντα, ακόμη και όταν χρησιμοποιείται εκτός εκείνης της εμβέλειας. Ξαναχτίστε υπό την επιθυμητή pragma αν η συμπεριφορά πρέπει να αλλάξει.\Q...\Eγια κυριολεκτικό κείμενο. Για να μεταγλωττίσετε ένα μοτίβο που ταιριάζει κατά λέξη μια συμβολοσειρά παρεχόμενη από τον χρήστη, τυλίξτε την με\Q...\E:qr/\Q$literal\E/. Χωρίς\Q, οι μετα-χαρακτήρες στη συμβολοσειρά ερμηνεύονται ως σύνταξη regex.Κενό μοτίβο. Η
qr//μεταγλωττίζεται σε κενό μοτίβο, το οποίο αντιμετωπίζεται ειδικά τη στιγμή της αντιστοίχισης: το$str =~ $emptyεπαναχρησιμοποιεί το τελευταίο επιτυχημένο μοτίβο σε εκείνη την εμβέλεια. Αυτή είναι συμπεριφορά τηςmτη στιγμή της αντιστοίχισης, όχι ιδιαιτερότητα τηςqr//, αλλά αποτελεί συνηθισμένη παγίδα όταν κυκλοφορεί μια προεπιλεγμένηqr//ως όρισμα.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
m- αντιστοιχίζει ένα μεταγλωττισμένο μοτίβο ή κυριολεκτικό μοτίβο σε συμβολοσειρά· ο κύριος καταναλωτής ενός αντικειμένουqr//s- αντικαθιστά χρησιμοποιώντας μεταγλωττισμένο μοτίβο· δέχεται μιαqr//στη θέση αναζήτησηςsplit- διασπά πάνω σε μεταγλωττισμένο μοτίβο· η μορφήqr//είναι η πιο αποδοτική-
full regex syntax reference; read this for the meaning of the modifiers and escape sequences
ref- επιστρέφει"Regexp"για αντικείμενοqr//· ο τυπικός έλεγχος τύπουeval- τυλίξτε τηνqr//όταν η πηγή του μοτίβου είναι μη έμπιστη και ένα σφάλμα μεταγλώττισης θα πρέπει να είναι ανακτήσιμο