Βαθμωτά και συμβολοσειρές

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 - αναζήτηση από offset 0.

  • 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 της τελευταίας εμφάνισης στο ή πριν το POSITION

  • substr - εξαγωγή της περιοχής αντιστοίχισης αφού την εντοπίσει η index, ή αντικατάστασή της επιτόπου

  • length - άνω όριο για έγκυρο POSITION· επιστρέφει μήκος χαρακτήρων στην ίδια κλίμακα που χρησιμοποιεί η index

  • pos - παρακολούθηση θέσης για σάρωση βασισμένη σε regex· χρησιμοποιήστε μαζί με m//g όταν χρειάζεστε συλλήψεις αντί για ακατέργαστο offset

  • sprintf - δημιουργία της συμβολοσειράς αναζήτησης όταν η SUBSTR συναρμολογείται από μέρη· η index δέχεται κυριολεκτική, οπότε προετοιμάστε την πρώτα