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אינו מפרש offset שלילי כ־״מהסוף״ - זו עבודתו שלrindex, וגם שם הסמנטיקה שונה.POSITIONמעבר לסוףSTRמהודק ל־length STR, כך שרקSUBSTRריק יכול להתאים.ארגומנטים undef מומרים למחרוזת
""ומפעילים אזהרתuninitializedתחתuse warnings.index(undef, "x")הוא-1;index("abc", undef)הוא0(כלל תת־המחרוזת הריקה).תווים, לא בתים.
indexפועל על רצף התווים הלוגי של המחרוזת. עבור מחרוזת של תווים רחבים, ה־offset המוחזר הוא offset של תווים, לא offset של בתים. אם נחוצים offset־ים של בתים, יש להוריד או לקודד את המחרוזת תחילה (use 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מקבל ליטרל, אז יש להכינה תחילה