rindex#
Βρίσκει τη θέση της τελευταίας εμφάνισης μιας υποσυμβολοσειράς μέσα σε μια συμβολοσειρά.
Η rindex είναι το αντίστοιχο της index από δεξιά προς τα αριστερά. Σαρώνει τη STR για τη SUBSTR και επιστρέφει το offset με βάση το μηδέν της δεξιότερης αντιστοιχίας, ή -1 αν δεν υπάρχει αντιστοιχία. Όταν δίνεται POSITION, η αναζήτηση περιορίζεται σε αντιστοιχίες των οποίων το offset εκκίνησης είναι μικρότερο ή ίσο της POSITION - δηλαδή, η τελευταία εμφάνιση σε αυτή τη θέση ή πριν από αυτήν.
Σύνοψη#
rindex $str, $substr
rindex $str, $substr, $position
Τι επιστρέφεται#
Έναν ακέραιο. Μηδέν ή θετικό σημαίνει το offset με βάση το μηδέν της δεξιότερης αντιστοιχίας· -1 σημαίνει ότι η SUBSTR δεν εμφανίζεται στη STR (υποκείμενο στον περιορισμό POSITION, αν υπάρχει).
Τα offsets μετρώνται σε χαρακτήρες όταν η STR περιέχει συμβολοσειρά χαρακτήρων, και σε bytes όταν η STR είναι συμβολοσειρά bytes. Αυτό ταιριάζει με την index και τις υπόλοιπες ενσωματωμένες συναρτήσεις συμβολοσειρών της Perl - η μονάδα είναι ό,τι χρησιμοποιεί η ίδια η συμβολοσειρά.
Πώς η POSITION διαμορφώνει την αναζήτηση#
Η POSITION είναι ένα άνω φράγμα στο offset εκκίνησης της αντιστοιχίας, όχι στο σημείο όπου ξεκινά η σάρωση. Το αποτέλεσμα ικανοποιεί:
result <= POSITIONresult + length(SUBSTR) <= length(STR)(όπως πάντα)
Συγκεκριμένα:
Η
POSITIONπαραλείπεται ή είναιundef- αναζητήστε ολόκληρη τη συμβολοσειρά· επιστρέψτε τη δεξιότερη αντιστοιχία.Η
POSITIONείναι μεγαλύτερη ή ίση τουlength(STR)- συμπεριφέρεται σαν ηPOSITIONνα ήτανlength(STR)· λαμβάνεται υπόψη ολόκληρη η συμβολοσειρά.Η
POSITIONείναι μικρότερη του0- συμπεριφέρεται σαν ηPOSITIONνα ήταν0· μόνο αντιστοιχία που ξεκινά στο offset0μπορεί να ικανοποιήσει τον περιορισμό, οπότε η τιμή επιστροφής είναι0όταν ηSTRξεκινά με τηSUBSTRκαι-1διαφορετικά.Κενή
SUBSTR- κάθε offset από0έωςlength(STR)αποτελεί έγκυρη θέση αντιστοιχίας, οπότε ηrindexεπιστρέφειmin(POSITION, length(STR))(ήlength(STR)όταν παραλείπεται ηPOSITION).
Σκεφτείτε την POSITION ως «βρες την τελευταία αντιστοιχία εδώ ή πριν από εδώ», όχι ως «ξεκίνα τη σάρωση εδώ».
Παραδείγματα#
Βασική αναζήτηση από δεξιά προς τα αριστερά:
rindex("banana", "a"); # 5 (the final 'a')
rindex("banana", "na"); # 4 (last "na")
rindex("banana", "z"); # -1 (not found)
Βηματισμός προς τα πίσω σε κάθε εμφάνιση χρησιμοποιώντας κάθε αποτέλεσμα, μείον ένα, ως την επόμενη POSITION:
my $str = "banana";
my $pos = length($str);
while ((my $hit = rindex($str, "a", $pos - 1)) >= 0) {
print "match at $hit\n"; # 5, 3, 1
$pos = $hit;
}
Η POSITION ως άνω φράγμα - η αντιστοιχία πρέπει να ξεκινά σε αυτή τη θέση ή πριν από αυτήν:
rindex("banana", "na", 3); # 4? No: 4 > 3, so the match at 4
# is excluded; returns 2
rindex("banana", "na", 4); # 4 (match starting at 4 is allowed)
Η κενή SUBSTR ταιριάζει σε κάθε offset, οπότε το αποτέλεσμα είναι η περικομμένη θέση:
rindex("banana", "", 4); # 4
rindex("banana", ""); # 6 (length of "banana")
Συνδυασμός με την index για τον εντοπισμό του τελευταίου τμήματος μιας οριοθετημένης συμβολοσειράς - συνηθισμένο ιδίωμα για την απομόνωση τελικής επέκτασης ή συστατικού διαδρομής:
my $path = "/usr/local/bin/perl";
my $slash = rindex($path, "/");
my $file = substr($path, $slash + 1); # "perl"
Οριακές περιπτώσεις#
Υποσυμβολοσειρά μεγαλύτερη από συμβολοσειρά: η
rindex("abc", "abcd")επιστρέφει-1. Καμία αντιστοιχία δεν μπορεί να χωρέσει.Υποσυμβολοσειρά ίση με τη συμβολοσειρά: η
rindex("abc", "abc")επιστρέφει0. Η τελευταία (και μοναδική) αντιστοιχία ξεκινά στο offset0.Η
POSITIONπέρα από το τέλος: ηrindex($str, $sub, 9999)συμπεριφέρεται σαν ηPOSITIONνα ήτανlength($str)- σαρώνεται ολόκληρη η συμβολοσειρά.Η
POSITIONείναι αρνητική: αντιμετωπίζεται ως0. Ηrindex("abc", "b", -5)επιστρέφει-1(καμία αντιστοιχία δεν μπορεί να ξεκινήσει στο offset0ή νωρίτερα)· ηrindex("abc", "a", -5)επιστρέφει0.Η
POSITIONείναιundef: το ίδιο με την παράλειψή της. Υπόuse warningsαυτό εκπέμπει προειδοποίησηuninitialized.Κενή
STR, μη κενήSUBSTR: επιστρέφει-1.Κενή
STR, κενήSUBSTR: επιστρέφει0.Unicode: για συμβολοσειρές χαρακτήρων (αυτές που ο διερμηνέας γνωρίζει ότι είναι κείμενο), τα offsets μετρούν χαρακτήρες, όχι bytes. Μια συμβολοσειρά μεταβεβλημένη σε σημασιολογία bytes μέσω
use bytesήencode_utf8θα αναφέρει offsets bytes αντί γι” αυτό. Ο κανόνας αντικατοπτρίζει τιςindexκαιsubstr.Tainted ορίσματα: το αποτέλεσμα κληρονομεί taint από τις
STRκαιSUBSTRυπό-T.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
index- το αντίστοιχο από αριστερά προς τα δεξιά· πανομοιότυπες συμβάσεις ορισμάτων, επιστρέφει την πρώτη εμφάνισηsubstr- τυπικά η επόμενη κλήση μετά από επιτυχημένηrindex, για να φετάρει την αντιστοιχισμένη περιοχή ή ό,τι ακολουθείlength- χρήσιμη κατά τον υπολογισμό της ουραίας φέτας:substr($s, $hit + length($sub))pos- για σάρωση οδηγούμενη από regex όπου χρειάζεστε την κατάσταση αντιστοιχίας της μηχανής αντί για ένα μοναδικό offset υποσυμβολοσειράςsplit- όταν θέλετε κάθε τμήμα οριοθετημένο από τηSUBSTR, όχι μόνο το τελευταίοreverse- σε συνδυασμό με τηνindexθεωρείται μερικές φορές κατά λάθος υποκατάστατο τηςrindex· ηrindexείναι σαφέστερη και γρηγορότερη