Τελεστές σύνδεσης regex#
Δύο τελεστές που συνδέουν μια συμβολοσειρά με μια πράξη κανονικής έκφρασης. Δεν εκτελούν οι ίδιοι την αντιστοιχία· απλώς λένε «η είσοδος αυτής της έκφρασης είναι αυτή η συμβολοσειρά».
Τελεστής | Διαβάζεται ως | Χρήση |
|---|---|---|
| ταιριάζει | σύνδεση πράξης regex ( |
| δεν ταιριάζει | ίδιο, με αρνημένο το λογικό αποτέλεσμα |
$str =~ /pattern/ # match: TRUE if $str contains a match
$str =~ s/foo/bar/ # substitution: returns count of changes
$str =~ tr/a-z/A-Z/ # transliteration: returns count
$str !~ /pattern/ # match negated: TRUE if NO match
Χωρίς ρητή σύνδεση, οι πράξεις regex δρουν στην $_:
$_ = "hello";
print "match\n" if /h/; # implicit $_ binding
Οι =~ και !~ είναι ο τρόπος που ανακατευθύνετε αυτή την είσοδο σε μια διαφορετική μεταβλητή.
Τι πραγματικά επιστρέφουν#
Ο =~ επιστρέφει ό,τι θα επέστρεφε η πράξη regex στα δεξιά:
m//- λογική τιμή (αληθής σε αντιστοιχία, ψευδής αν δεν υπάρχει) σε βαθμωτό περιβάλλον· οι ομάδες σύλληψης σε περιβάλλον λίστας.s///- ο αριθμός αντικαταστάσεων που εκτελέστηκαν (που είναι λογικά αληθής όταν ≥ 1).tr///- ο αριθμός χαρακτήρων που επεξεργάστηκαν.
Ο !~ επιστρέφει τη λογική άρνηση, ανεξάρτητα από την υποκείμενη πράξη. Χρησιμοποιείται κυρίως με m//:
print "no digit" if $str !~ /\d/;
print "$n changes" if $str =~ s/foo/bar/g;
my @hits = $str =~ /(\w+)/g; # list context: captures
Τρεις εταίροι πράξεων#
Ο =~ δέχεται τρεις πράξεις regex στα δεξιά του:
m//- αντιστοιχία. Τοmείναι προαιρετικό όταν οι οριοθέτες είναι κάθετοι: η$s =~ /pattern/και η$s =~ m{pattern}λειτουργούν και οι δύο.s///- αντικατάσταση. Τρία μέρη: μοτίβο, αντικατάσταση, σημαίες. Επιστρέφει το πλήθος αντικαταστάσεων.tr///(επίσης γράφεταιy///) - μεταγραμματισμός. Αντικαθιστά χαρακτήρες ένα-προς-ένα μεταξύ δύο συνόλων χαρακτήρων. Επιστρέφει το πλήθος χαρακτήρων που επεξεργάστηκαν.
$line =~ /(\d+)/ # extract first run of digits
$line =~ s/^\s+// # strip leading whitespace
$line =~ s/\s+/ /g # collapse all whitespace to single spaces
$line =~ tr/A-Z/a-z/ # ASCII lowercase
!~ μόνο με m//#
Ο !~ έχει νόημα μόνο με την πράξη αντιστοιχίας, αφού η αντικατάσταση και ο μεταγραμματισμός επιστρέφουν πλήθη και η περίπτωση «δεν έγιναν αλλαγές» είναι ένα νόημο μηδέν, όχι λογική τιμή «δεν ταίριαξε». Η Perl θα σας αφήσει να γράψετε $s !~ s/.../.../, αλλά σχεδόν ποτέ δεν το θέλετε - το αποτέλεσμα !s/// είναι «αληθές αν μηδέν αντικαταστάσεις» που διαβάζεται περίεργα. Μείνετε στο !~ /.../.
Lvalue έναντι rvalue#
Ο =~ δεν αναθέτει ο ίδιος. Μόνο δρομολογεί την πράξη regex στα δεξιά του στη συμβολοσειρά στα αριστερά. Η πράξη η ίδια μπορεί στη συνέχεια να μεταλλάξει αυτή τη συμβολοσειρά - η s/// και η tr/// το κάνουν, η m// όχι - αλλά η μετάλλαξη προέρχεται από την πράξη, όχι από τον =~:
my $s = "hello";
$s =~ s/l/L/g; # mutates $s - now "heLLo"
my $n = $s =~ /(\w+)/; # does NOT mutate $s; $n is the boolean result
Η συμβολοσειρά στα αριστερά του =~ πρέπει να είναι τροποποιήσιμη για s/// και tr///. Μια κυριολεκτική συμβολοσειρά ή η $1 (μεταβλητή σύλληψης regex) θα αποτύχει με «Modification of a read-only value attempted»:
"hello" =~ s/l/L/g; # FATAL - literal is read-only
$1 =~ s/x/y/; # FATAL - capture variable is read-only
Αντιγράψτε πρώτα αν χρειάζεται να τροποποιήσετε πηγή μόνο-ανάγνωσης:
(my $copy = $1) =~ s/x/y/; # idiom for "modify a copy of $1"
Προτεραιότητα#
Οι =~ και !~ βρίσκονται στη γραμμή 6 του πίνακα precedence - αρκετά σφιχτά, μεταξύ μοναδιαίων και πολλαπλασιαστικών τελεστών. Γι” αυτό μπορείτε να γράψετε $s =~ /foo/ && $t =~ /bar/ χωρίς παρενθέσεις γύρω από κάθε αντιστοιχία.
Παραπομπή σε οδηγό#
Ο οδηγός λογικής τιμών καλύπτει τα regex ως άλγεβρα συνόλων στο κεφάλαιο εφαρμογών - εναλλαγή ως ένωση, διεκδικήσεις ως τομή και συμπληρωματικό:
Boolean Logic - Applications (η ενότητα Regular expressions: logic on sets of strings)
Η πλήρης αναφορά γλώσσας regex βρίσκεται στον οδηγό regex: