Κανονικές εκφράσεις και αντιστοίχιση μοτίβων

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//. Συλλαμβάνονται στο αντικείμενο που επιστρέφεται και διαδίδονται όταν το αντικείμενο παρεμβάλλεται σε άλλο μοτίβο.

Σημαία

Σημασία

m

Πολυγραμμικός: τα ^ και $ ταιριάζουν σε εσωτερικές νέες γραμμές.

s

Μονογραμμικός: το . ταιριάζει με χαρακτήρα νέας γραμμής.

i

Αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων.

x

Εκτεταμένος: οι λευκοί χαρακτήρες και τα σχόλια # αγνοούνται στο μοτίβο. Ο xx αγνοεί επιπλέον τους λευκούς χαρακτήρες μέσα σε [...].

p

Διατήρηση αντιστοιχίας (χωρίς αποτέλεσμα σε Perl 5.20+· τα ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} είναι πάντοτε διαθέσιμα).

o

Μεταγλώττιση μία φορά· οι παρεμβαλλόμενες μεταβλητές παγώνουν στην πρώτη χρήση. Σπάνια χρειάζεται - η qr// ήδη αποθηκεύει σε cache.

a

Περιορίζει τα \d, \s, \w και τις κλάσεις POSIX σε ASCII. Ο aa απαγορεύει επιπρόσθετα αντιστοιχίσεις ASCII-προς-μη-ASCII υπό το i.

l

Χρήση των κανόνων του τρέχοντος locale.

u

Χρήση κανόνων Unicode.

d

Προεπιλεγμένοι διπλοί κανόνες (legacy· συνήθως υιοθετούνται αυτόματα).

n

Μη σύλληψη: οι ανώνυμες ομάδες (...) δεν γεμίζουν τα $1, $2, ….

Όταν ένα μεταγλωττισμένο μοτίβο ενσωματώνεται σε μεγαλύτερο μοτίβο, οι σημαίες χαρακτηροσυνόλου και 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// είναι η πιο αποδοτική

  • Regular expressions guide

    • full regex syntax reference; read this for the meaning of the modifiers and escape sequences

  • ref - επιστρέφει "Regexp" για αντικείμενο qr//· ο τυπικός έλεγχος τύπου

  • eval - τυλίξτε την qr// όταν η πηγή του μοτίβου είναι μη έμπιστη και ένα σφάλμα μεταγλώττισης θα πρέπει να είναι ανακτήσιμο