ביטויים רגולריים והתאמת תבניות
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כיוון אליו פעם