reset#
ניקוי כל משתנה חבילה ששמו מתחיל באחת מקבוצת אותיות, וחימוש מחדש של התאמות m?pattern? חד־פעמיות.
reset הוא שריד מעולמו של Perl 4 שעבד אך ורק עם משתנים גלובליים. בקוד מודרני הוא שורד בשני תפקידים צרים: חימוש מחדש של regex־י m?...? של התאמה־אחת כך שיופעלו שוב, ו־ - בסוף בלוק continue של לולאה - מחיקת אצווה של משתני חבילה לפני האיטרציה הבאה. הישגו מוגבל לחבילה הנוכחית ולמשתני חבילה; כל מה שמוצהר עם my אינו נוגע בו.
תקציר#
reset EXPR
reset
EXPR היא מחרוזת המפורשת כקבוצה של תווים בודדים, כאשר מקפים מותרים כטווחים: 'X', 'a-z', 'abc', 'A-Za-z'. כל סקלר, מערך, והאש בחבילה הנוכחית ששמו מתחיל באחת מאותן אותיות מאופס למצבו הראשוני הלא־מוגדר.
ללא ארגומנט, רק חיפושי m?pattern? חד־פעמיים בחבילה הנוכחית מחומשים מחדש - לא נוגעים במשתנים.
מה מקבלים בחזרה#
תמיד 1. ערך ההחזרה אינו נושא איתות הצלחה; אין דבר ש־reset יכול להיכשל בו.
מצב גלובלי שהוא נוגע בו#
כל משתנה חבילה בחבילה הנוכחית ששמו מתחיל באות שברשימה: סקלרים, מערכים, והאשים כולם יחד. סקלרים הופכים ל־
undef, מערכים והאשים הופכים לריקים.regex־ים חד־פעמיים (
m?pattern?) שהודרו בחבילה הנוכחית - הדגל ״כבר הותאם״ שלהם מנוקה כך שההערכה הבאה מתאימה שוב.אינו חוצה גבולות חבילה.
reset 'X'בתוךpackage Fooמשאיר את$Bar::Xבמקומו.אינו נוגע בלקסיקלים.
my $xו־our $xמתנהגים שונה כאן:ourהוא כינוי למשתנה החבילה ומאופס;myלא.
דוגמאות#
חימוש מחדש של כל ההתאמות החד־פעמיות בחבילה הנוכחית - השימוש המודרני האופייני ב־reset:
reset;
ניקוי כל משתנה חבילה המתחיל ב־X בחבילה הנוכחית:
package Stats;
our $Xtotal = 0;
our @Xsamples = (1, 2, 3);
our %Xindex = (a => 1);
reset 'X';
# $Xtotal, @Xsamples, %Xindex are all emptied
איפוס בתחתית הלולאה כך שהאיטרציה הבאה מתחילה נקי:
while (more_work()) {
process();
} continue {
reset 'abc'; # wipe $a*, @b*, %c* package vars for next pass
}
טווח תווים - רק משתנים באותיות קטנות:
reset 'a-z';
שילוב של אותיות בודדות וטווחים:
reset 'a-cXY'; # a, b, c, X, Y
מקרי קצה#
resetללא ארגומנט אינו נוגע במשתנים כלל. הוא מחמש מחדש התאמותm?...?חד־פעמיות בחבילה הנוכחית וכלום מעבר לכך. אם רוצים לנקות משתנים חייבים להעביר ארגומנט.לקסיקלים בלתי־נראים ל־
reset.my $Xtotalאינו מושפע כלל מ־reset 'X'; רק משתנה החבילה$Xtotalמושפע. קוד שהיגר מ־our/גלובלים־של־חבילה ל־myימצא ש־resetהפך בשקט ל־no-op עבור משתנים אלה.reset 'A-Z'הוא foot-gun. בחבילתmainזה מוחק את@ARGV,@INC,%ENVוכל גלובלי אחר באותיות גדולות, כמעט בוודאי לא מה שהתכוונו.סקלרים, מערכים, והאשים חולקים מרחב שמות אחד כאן.
reset 'X'מנקה כל משתנה מכל sigil ששמו מתחיל ב־X, לא רק סקלרים. אין דרך להגביל את האיפוס ל־sigil אחד.החבילה הנוכחית נקבעת בזמן ההידור באמצעות הצהרת
packageהעוטפת, לא על־ידי הקורא. קריאה ל־resetבתוך מודול מנקה את משתני המודול ההוא, לא של הקורא.אין צורת ארגומנט regex.
resetמקבל מחרוזת של אותיות, לא regex או רשימת שמות. לא ניתן לכתובreset qr/^X/אוreset '$Xtotal'- האחרון מנסה לאפס משתנים המתחילים ב־$,X,t,o,a,l, וזה כמעט אף פעם לא מה שהמחבר התכוון.
הבדלים מ־upstream#
ה־
resetשל pperl הוא no-op - הקריאה נפרסת, מחזירה1, ואין לה תופעות לוואי. משתני חבילה אינם מנוקים ומצב התאמה חד־פעמית שלm?pattern?אינו נמעקב. קוד שמסתמך עלresetלמחיקת אצווה של גלובלים בסוף לולאה, או להפעלה מחדש של regex של התאמה אחת, לא יראה התנהגות זו תחת pperl. העדיפוmyו־regex־יm//רגילים - שניהם עובדים זהה ב־pperl וב־upstream, והם האידיום המומלץ גם ב־upstream.
ראו גם#
my- משתנים לקסיקליים; מועדפים בכל קוד חדש ולא מושפעים מ־resetlocal- שמירה/שחזור בתחום דינמי של משתנה חבילה, התשובה הרגילה כשרוצים שינוי זמני ללא ניקוי ידניm- צורת ה־m//הרגילה;m?...?היא הווריאנט החד־פעמי ש־resetמחמש מחדשcontinue- בלוק סוף־לולאה שבו ממוקם איפוס־אצווה של מצב איטרציה לפי המוסכמהpackage- מצהיר על משתני איזו חבילהresetיפעלundef- ניקוי משתנה נקוב יחיד, החלופה לכל־משתנה ל־resetרחב