continue#
מצרף לולאה לבלוק שרץ לאחר כל איטרציה, רגע לפני שהתנאי נבדק שוב.
continue אינה פונקציה מובנית - זוהי מילת מפתח של זרימת בקרה. במשמעותה היחידה שנותרה היא מציגה את הבלוק הגורר של לולאת while, until, או foreach. הבלוק רץ בסוף כל איטרציה וגם בכל פעם ש־next מעביר בקרה החוצה מהגוף הראשי, אבל לא כאשר last או redo עושים זאת. הוא משחק את התפקיד שהפסוקית השלישית של לולאת for (init; cond; step) ב־C משחקת ב־C.
תקציר#
while (EXPR) { BODY } continue { STEP }
until (EXPR) { BODY } continue { STEP }
for VAR (LIST) { BODY } continue { STEP }
foreach VAR (LIST) { BODY } continue { STEP }
LABEL: while (EXPR) { BODY } continue { STEP }
מה מקבלים בחזרה#
continue היא הוראה, לא ביטוי. אין לה ערך החזרה והיא לא יכולה להופיע במיקום של ערך. הלולאה עצמה מניבה את מה שההקשר שלה דורש (כלום בהקשר void, הביטוי האחרון שהוערך תחת חלק מהמבנים); בלוק ה־continue אינו תורם לכך.
מודל הביצוע#
עבור לולאה עם בלוק continue מצורף, כל איטרציה רצה בסדר הזה:
הערכת התנאי (או לקיחת אלמנט הרשימה הבא, עבור
foreach). אם הלולאה לא צריכה לרוץ שוב, יציאה.הרצת הגוף הראשי.
הרצת בלוק ה־
continue.חזרה לשלב 1.
שלוש מילות המפתח של בקרת הלולאה מתאימות עם בלוק ה־continue באופן שונה:
next- קופץ ישר לשלב 3. בלוק ה־continueמורץ, אחר־כך התנאי נבדק שוב. זוהי כל הנקודה של בלוקcontinue: מצב שחייב להתקדם בכל איטרציה (מונה, מספר שורה, איפוס התאמה חד־פעמית) עדיין מתקדם כשהגוף מקצר באמצעותnext.last- יוצא מהלולאה כליל. בלוק ה־continueאינו מורץ.redo- מתחיל את שלב 2 מחדש מבלי לבדוק שוב את התנאי ומבלי להריץ את בלוק ה־continue. יש להשתמש בו כאשר הגוף זקוק למעבר נוסף על נתוני האיטרציה הנוכחית (לדוגמה, לאחר שילוב של קלט נוסף).
השמטת בלוק ה־continue שקולה לבלוק ריק.
דוגמאות#
מונה שמתקדם גם כשהגוף מדלג:
my $n = 0;
for my $line (@lines) {
next if $line =~ /^\s*#/; # skip comments
process($line);
} continue {
$n++; # still counts skipped lines
}
print "scanned $n lines\n";
שקילות ללולאת for בסגנון C - שתי הצורות למטה זהות, כי Perl כותב מחדש את הכותרת בסגנון C כ־while עם בלוק continue:
for (my $i = 1; $i < 10; $i++) { say $i }
my $i = 1;
while ($i < 10) {
say $i;
} continue {
$i++;
}
איפוס התאמות חד־פעמיות ומוני שורות בעת זרימת קבצים עם <>:
while (<>) {
m?(fred)? && s//WILMA/;
m?(barney)? && s//BETTY/;
} continue {
print "$ARGV $.: $_";
close ARGV if eof; # reset $.
reset if eof; # reset ?pat?
}
האינטראקציה עם redo - שימו לב ש־continue רץ במסלול של next אבל לא במסלול של redo:
while (<>) {
chomp;
if (s/\\$//) {
$_ .= <>;
redo unless eof; # merge continuation, re-enter body
} # continue block skipped on redo
process($_);
} continue {
$seen++; # counts completed records only
}
מקרי קצה#
ללא בלוק גורר -
continueחשוף (ללא{ ... }עוקב) הוא שגיאת ניתוח ב־Perl 5.42. הוא היה הוראה תקפה בתוך המבנהgiven/whenשל תכונתswitch, שם נפל למקרה ה־whenהבא. תכונה זו הוסרה ב־5.42; ל־continueיש משמעות עתה רק כבלוק גורר של לולאה.lastמדלג על בלוק ה־continue. אם הבלוק מחזיק ניקוי שאתם צריכים בכל מסלול יציאה, יש להניח את הניקוי לאחר הלולאה או ב־scope guard, לא ב־continue.redoמדלג על בלוק ה־continue. אם בלוק ה־continueמקדם מונה, איטרצייתredoלא תקדם אותו - זה לרוב מה שרוצים (האיטרציה עדיין לא הסתיימה) אבל זה יכול להפתיע קוד הסומך על כך שהמונה תואם את מספר הכניסות לגוף.do { ... } whileאינה לולאה אמיתית -last,next, ו־redoלא עובדים בה, ובלוקcontinueגורר הוא שגיאת תחביר.לולאות עם תווית -
LABEL:מצורף למילת המפתחwhile/for/foreach, לא ל־continue.next LABELו־last LABELמכוונים ללולאה כולה; בלוק ה־continueהוא חלק מאותה לולאה.בלוק לבדו הוא לולאה חד־פעמית, אז
{ ... } continue { ... }חשוף מנותח ומריץ את בלוק ה־continueפעם אחת לאחר הגוף - שימושי לעיתים נדירות, אך חוקי.Foreach עם aliasing - בתוך לולאת
foreachמשתנה הלולאה מהווה alias לאלמנט הרשימה הנוכחי. בלוק ה־continueעדיין רץ עם alias זה בתחום, ולכן ניתן לבחון או לשנות את האלמנט שם בדיוק כמו בגוף.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
next- קופץ לבלוק ה־continue(אם קיים) ובודק שוב את התנאי; מילת המפתח היחידה של בקרת לולאה שכן מריצה את בלוק ה־continuelast- יוצא מהלולאה כליל; מדלג על בלוק ה־continueredo- מתחיל את הגוף מחדש מבלי לבדוק שוב את התנאי; מדלג על בלוק ה־continuereturn- יוצא מתת־השגרה העוטפת; גם הוא מדלג על בלוק ה־continueכי הוא יוצא מהלולאהbreak- מילת מפתח נלווית של תכונת ה־switchשהוסרה; כמו צורתgiven/whenהחשופה שלcontinue, אינה זמינה עוד ב־5.42