Τελεστές σύνδεσης regex#

Δύο τελεστές που συνδέουν μια συμβολοσειρά με μια πράξη κανονικής έκφρασης. Δεν εκτελούν οι ίδιοι την αντιστοιχία· απλώς λένε «η είσοδος αυτής της έκφρασης είναι αυτή η συμβολοσειρά».

Τελεστής

Διαβάζεται ως

Χρήση

=~

ταιριάζει

σύνδεση πράξης regex (m//, s///, tr///)

!~

δεν ταιριάζει

ίδιο, με αρνημένο το λογικό αποτέλεσμα

$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 ως άλγεβρα συνόλων στο κεφάλαιο εφαρμογών - εναλλαγή ως ένωση, διεκδικήσεις ως τομή και συμπληρωματικό:

Η πλήρης αναφορά γλώσσας regex βρίσκεται στον οδηγό regex:

Δείτε επίσης#

  • m//, s///, tr///, qr//, split - οι μορφές perlfunc που καταναλώνουν regex.

  • $_ - η προεπιλεγμένη μεταβλητή εισόδου όταν δεν δίνεται σύνδεση.

  • Regex match variables - $&, $1..$N, %+, @+, @-: τι γεμίζει κάθε επιτυχημένη αντιστοιχία.