ביטויים רגולריים והתאמת תבניות

study#

no-op שנשמר לתאימות מקור עם קוד Perl ישן יותר.

study מקבל ארגומנט סקלרי (או פועל על $_ כשנקרא ללא אף אחד) ולא עושה איתו דבר. הקריאה תקפה, הארגומנט מוערך, והשליטה חוזרת מיד. אין אינדקס שנבנה, אין מצב של מנוע regex שמשתנה, אין התאמה מאוחרת יותר שרצה מהר או לאט יותר בגללו.

השם שורד מכיוון שעשורים של קוד Perl - ספרים, FAQים, הפצות CPAN, סקריפטים בית־מקומיים - מפזרים את study לפני מחרוזות ארוכות שעומדות להיות מותאמות מול תבניות רבות. אותן תוכניות עדיין מתפרסרות ועדיין רצות. הן פשוט כבר לא מקבלות את האופטימיזציה שמילת המפתח הבטיחה פעם.

תקציר#

study SCALAR
study

מה מקבלים בחזרה#

תמיד 1. ערך ההחזרה אינו מתועד כשימושי ואף קוד ניבי לא בוחן אותו. התייחס ל־study כמחזיר שום דבר ששווה ללכוד.

היסטוריה#

עד Perl 5.14 study בנה אינדקס הפוך של הבייטים ב־SCALAR, ואז הטה את מנוע ה־regex לעגן כל התאמה עוקבת על התו הנדיר ביותר בתבנית (נדירות מוערכת מטבלת תדירות סטטית מוטמעת בפרשן). עומס העבודה המיועד היה ״מחרוזת ארוכה אחת, הרבה m// נגדה״: האינדקס היה ממוצע על־פני ההתאמות.

האופטימיזציה הוסרה ב־Perl 5.16. היא תקיפה רע עם Unicode, קיפול אותיות /i ועם מנוע ה־regex שאחרי 5.10, ועלות התחזוקה זה זמן רב עלתה על עומס העבודה הצר שהיא עזרה לו. מילת המפתח נשמרה כ־no-op כדי שמקור קיים ימשיך להידור.

דוגמאות#

ניב מורשת - עדיין מתפרסר, אין לו עוד אפקט:

study $big_text;
while ($big_text =~ /$pattern/g) {
    # ...
}

ללא ארגומנט - מוחל על $_, גם הוא no-op:

for (@lines) {
    study;
    print if /error/;
}

הנחיית החלפה: אם הקוד המקורי הסתמך על study לשם מהירות, התשובה המודרנית היא להדר את התבנית פעם אחת עם qr ולעשות בה שימוש חוזר, או לארגן מחדש כך שהעבודה החוזרת תהיה בצד התבנית, לא בצד המחרוזת:

my $re = qr/$pattern/;
for my $line (@lines) {
    print $line if $line =~ $re;
}

מקרי קצה#

  • אין השפעה על ביצועי regex. הסרת כל קריאת study מתוכנית אינה משנה דבר נצפה, כולל timing מעבר לרעש מדידה.

  • הארגומנט עדיין מוערך. study some_expensive_call() מריץ את some_expensive_call() לתופעות־הלוואי שלו ולערך ההחזרה, ואז משליך את התוצאה. כמעט אף פעם זה אינו מה שהכותב התכוון.

  • אין אזהרה על שימוש. study אינו מזהיר תחת use warnings ואינו מסומן כ־deprecated, כך ש־linter הוא הדרך היחידה לסמן הופעות מיושנות ב־codebase.

  • לא פראגמה, לא רמז. study הוא ביטוי מובנה רגיל. הוא אינו מתמיד בין הוראות ואין מצב ״נחקר״ המוצמד לסקלר.

  • Tainting ו־magic לא נוגעים. study $tainted אינו מלבן taint, אינו מפעיל FETCH על סקלר קשור יותר משקריאה רגילה הייתה, ואינו מסמן את הסקלר בשום צורה.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42. study הוא no-op בשניהם.

ראו גם#

  • qr - הדר תבנית פעם אחת והשתמש בצורה המהודרת חוזרות; זוהי התשובה המודרנית ל־״הפוך הרבה התאמות נגד אותו טקסט למהירות יותר״

  • m - אופרטור ההתאמה שעל ביצועיו study היה משפיע

  • index - חיפוש מחרוזת־קבועה, מהיר יותר מ־regex כשהתבנית היא תת־מחרוזת מילולית

  • pos - היכן ההתאמה האחרונה של /g הפסיקה, רלוונטי לעומס העבודה ״מחרוזת ארוכה אחת, הרבה התאמות״ ש־study כיוון אליו פעם