שונות

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 - משתנים לקסיקליים; מועדפים בכל קוד חדש ולא מושפעים מ־reset

  • local - שמירה/שחזור בתחום דינמי של משתנה חבילה, התשובה הרגילה כשרוצים שינוי זמני ללא ניקוי ידני

  • m - צורת ה־m// הרגילה; m?...? היא הווריאנט החד־פעמי ש־reset מחמש מחדש

  • continue - בלוק סוף־לולאה שבו ממוקם איפוס־אצווה של מצב איטרציה לפי המוסכמה

  • package - מצהיר על משתני איזו חבילה reset יפעל

  • undef - ניקוי משתנה נקוב יחיד, החלופה לכל־משתנה ל־reset רחב