rindex#
מציאת המיקום של המופע האחרון של תת־מחרוזת בתוך מחרוזת.
rindex הוא המקבילה מימין־לשמאל של index. הוא סורק את STR עבור SUBSTR ומחזיר את ה־offset מבוסס־האפס של ההתאמה הימנית ביותר, או -1 אם לא קיימת התאמה. כאשר POSITION ניתן, החיפוש מוגבל להתאמות שה־offset ההתחלתי שלהן קטן או שווה ל־POSITION - כלומר, המופע האחרון באותו מיקום או לפניו.
תקציר#
rindex $str, $substr
rindex $str, $substr, $position
מה מקבלים בחזרה#
מספר שלם. אפס או חיובי מסמן את ה־offset מבוסס־האפס של ההתאמה הימנית ביותר; -1 מסמן ש־SUBSTR אינו מופיע ב־STR (כפוף לאילוץ POSITION, אם יש).
Offsets נמדדים בתווים כאשר STR מחזיק מחרוזת תווים, ובבתים כאשר STR הוא מחרוזת בתים. זה תואם את index ואת שאר ה־builtins של מחרוזות ב־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 סופרים תווים, לא בתים. מחרוזת שהוחלפה לסמנטיקת בתים דרך
use bytesאוencode_utf8תדווח על offsets של בתים במקום. הכלל משקף אתindexו־substr.ארגומנטים מוכתמים: התוצאה יורשת 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ברור ומהיר יותר