index#
Βρίσκει τη θέση μιας υποσυμβολοσειράς μέσα σε μια συμβολοσειρά.
Η index σαρώνει τη STR από αριστερά προς τα δεξιά αναζητώντας την πρώτη εμφάνιση της SUBSTR και επιστρέφει τη θέση με βάση το μηδέν όπου ξεκινά. Καμία μετα-χαρακτήρας κανονικής έκφρασης, καμία πτύχωση πεζών-κεφαλαίων, κανένα wildcard - η SUBSTR αντιστοιχίζεται κυριολεκτικά, χαρακτήρα προς χαρακτήρα. Όταν η αναζήτηση αποτύχει, η index επιστρέφει -1.
Σύνοψη#
index STR, SUBSTR
index STR, SUBSTR, POSITION
Τι επιστρέφεται#
Έναν ακέραιο. Σε αντιστοιχία, το μηδενοβάσει offset του πρώτου χαρακτήρα της SUBSTR εντός της STR. Σε καμία αντιστοιχία, -1. Η τιμή-φρουρά είναι ο ιδιωματικός τρόπος ελέγχου:
if (index($line, $needle) >= 0) { ... } # found
if (index($line, $needle) == -1) { ... } # not found
Το POSITION και η τιμή επιστροφής χρησιμοποιούν την ίδια μηδενοβάσει κλίμακα, οπότε μπορείτε να τροφοδοτείτε τη μία στην άλλη για να διατρέξετε κάθε εμφάνιση:
my $pos = -1;
while (($pos = index($text, $needle, $pos + 1)) != -1) {
push @hits, $pos;
}
Πώς ερμηνεύεται το POSITION#
Το POSITION είναι το πρωιμότερο offset στο οποίο επιτρέπεται να ξεκινήσει η αντιστοιχία. Η αναζήτηση εξακολουθεί να προχωρά μέχρι το τέλος της STR· το POSITION δεν περιορίζει την αναζήτηση, απλώς μετατοπίζει το σημείο εκκίνησής της.
POSITIONπαραλειπόμενο ήundef- αναζήτηση από offset0.POSITIONαρνητικό ή αλλιώς πριν την αρχή - αντιμετωπίζεται ως0.POSITIONπέρα από το τέλος τηςSTR- αντιμετωπίζεται ως το τέλος, οπότε ο μόνος τρόπος αντιστοιχίας είναι αν ηSUBSTRείναι η κενή συμβολοσειρά (που αντιστοιχίζεται σε κάθε offset, συμπεριλαμβανομένου του τέλους).
Μια κενή SUBSTR ταιριάζει πάντα, και ταιριάζει στο POSITION (περικομμένο εντός εύρους). Αυτό απορρέει από τον κανόνα «η πρώτη θέση όπου εμφανίζεται η SUBSTR»: η κενή συμβολοσειρά εμφανίζεται παντού.
index("hello", ""); # 0
index("hello", "", 3); # 3
index("hello", "", 99); # 5 (clamped to end of string)
Παραδείγματα#
Εύρεση ενός μόνου χαρακτήρα ή μιας ολόκληρης λέξης:
index("Perl is great", "P"); # 0
index("Perl is great", "g"); # 8
index("Perl is great", "great"); # 8
Αναφορά αστοχίας:
index("Perl is great", "Z"); # -1
Παράκαμψη προηγούμενης αντιστοιχίας με POSITION για εύρεση της δεύτερης εμφάνισης:
index("Perl is great", "e", 5); # 10
Διάσχιση κάθε εμφάνισης μιας υποσυμβολοσειράς:
my $s = "abcabcabc";
my $p = -1;
while (($p = index($s, "bc", $p + 1)) != -1) {
print "hit at $p\n";
}
# hit at 1
# hit at 4
# hit at 7
Ένα συνηθισμένο ιδίωμα - έλεγχος εμπεριέχειας χωρίς δημιουργία regex:
if (index($path, "/tmp/") != -1) {
warn "path touches /tmp";
}
Συνδυάζεται φυσικά με substr για διαχωρισμό στην πρώτη εμφάνιση ενός διαχωριστή:
my $line = "key=value=with=equals";
my $eq = index($line, "=");
my ($k, $v) = $eq >= 0
? (substr($line, 0, $eq), substr($line, $eq + 1))
: ($line, undef);
Οριακές περιπτώσεις#
Κενή
SUBSTRταιριάζει στοPOSITION(περικομμένο εντός τηςSTR). Ηindex($s, "")είναι0· ηindex($s, "", $n)είναι το$nπεριορισμένο μέχρι τοlength $s. Ποτέ-1.Κενή
STRμε μη κενήSUBSTRεπιστρέφει-1. ΚενήSTRμε κενήSUBSTRεπιστρέφει0.Αρνητικό
POSITIONπερικόπτεται στο0. Ηindexδεν ερμηνεύει αρνητικά offsets ως «από το τέλος» - αυτή είναι η δουλειά τηςrindex, και ακόμη και εκεί η σημασιολογία διαφέρει.POSITIONπέρα από το τέλος τηςSTRπερικόπτεται στοlength STR, οπότε μόνο μια κενήSUBSTRμπορεί να ταιριάξει.Ορίσματα undef μετατρέπονται σε
""και πυροδοτούν προειδοποίησηuninitializedυπόuse warnings. Ηindex(undef, "x")είναι-1· ηindex("abc", undef)είναι0(κανόνας κενής υποσυμβολοσειράς).Χαρακτήρες, όχι bytes. Η
indexλειτουργεί επί της λογικής ακολουθίας χαρακτήρων της συμβολοσειράς. Για συμβολοσειρά πλατιών χαρακτήρων, το επιστρεφόμενο offset είναι offset χαρακτήρων, όχι bytes. Αν χρειάζεστε offsets bytes, υποβαθμίστε ή κωδικοποιήστε πρώτα τη συμβολοσειρά (use bytesγια λεξιλογική θέαση σε bytes, ήEncode::encode_utf8για να εργαστείτε σε συμβολοσειρά οκτάδων).Διάκριση πεζών-κεφαλαίων: η
indexλειτουργεί με διάκριση πεζών-κεφαλαίων. Μετατρέψτε πρώτα και τα δύο ορίσματα σε πεζά αν θέλετε αναζήτηση χωρίς διάκριση πεζών-κεφαλαίων, ή χρησιμοποιήστε=~ /\Q$needle\E/iκαι@-/$-[0]για να ανακτήσετε τη θέση.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
rindex- ίδιοι κανόνες αντιστοίχισης, σαρώνει από τα δεξιά και επιστρέφει το offset της τελευταίας εμφάνισης στο ή πριν τοPOSITIONsubstr- εξαγωγή της περιοχής αντιστοίχισης αφού την εντοπίσει ηindex, ή αντικατάστασή της επιτόπουlength- άνω όριο για έγκυροPOSITION· επιστρέφει μήκος χαρακτήρων στην ίδια κλίμακα που χρησιμοποιεί ηindexpos- παρακολούθηση θέσης για σάρωση βασισμένη σε regex· χρησιμοποιήστε μαζί μεm//gόταν χρειάζεστε συλλήψεις αντί για ακατέργαστο offsetsprintf- δημιουργία της συμβολοσειράς αναζήτησης όταν ηSUBSTRσυναρμολογείται από μέρη· ηindexδέχεται κυριολεκτική, οπότε προετοιμάστε την πρώτα