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
}
מקרי קצה#
No trailing block - bare
continue(without a following{ ... }) is a parse error in Perl 5.44. It used to be a valid statement inside theswitchfeature’sgiven/whenconstruct, where it fell through to the nextwhen. That feature was removed in 5.44;continuenow only has meaning as a trailing loop block.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#
Fully compatible with upstream Perl 5.44.
ראו גם#
next- קופץ לבלוק ה־continue(אם קיים) ובודק שוב את התנאי; מילת המפתח היחידה של בקרת לולאה שכן מריצה את בלוק ה־continuelast- יוצא מהלולאה כליל; מדלג על בלוק ה־continueredo- מתחיל את הגוף מחדש מבלי לבדוק שוב את התנאי; מדלג על בלוק ה־continuereturn- יוצא מתת־השגרה העוטפת; גם הוא מדלג על בלוק ה־continueכי הוא יוצא מהלולאהbreak- companion keyword of the removedswitchfeature; like the baregiven/whenform ofcontinue, no longer available in 5.44