לולאות

אז אתה יודע if/else , משתנים, השמות, אבל אני מתערב איתך שאתה לא יודע לולאות.

ובכן, ידידי אתה עדיין לא הגעת לסוף הדרך… טוב, אפילו לקרטה-קיד היו כמה דברים ללמוד ממר. מיאגי.

כל מי שתכנת אי פעם בשפה כלשהי מכיר את נושא הלולאות. אם אינך מכיר, אל תדאג מכיוון שמשלמים לי גם בשביל להראות לך את זה.

לולאות נמצאות תחת הקטגוריה של “command structure” בסקריפט. בד"כ לולאות מעצבות את גוף הסקריפט אשר שולח מידע והוראות לשאר הסקריפט. לולאות חוזרות שוב ושוב ועוצרות רק כאשר מתמלאים תנאים מסויימים, ראה כלל מספר 6.

כלל מספר 6: כל לולאה חייבת להסתיים. זה נשמע פשוט, ובד"כ זה אכן פשוט. עליך לעקוב אחר ערכי המשתנים שלך בכל שלב של הלולאה (ראה כלל מספר 3).

 

המבנה הייחודי של לולאה נראה כך (למרות שהן יכולות לכלול דברים נוספים בתוכן):

command (statement) { statements; }

סוג הלולאות הבסיסיות ב Perl הן לולאות ה fot ,לולאות ה while ולולאות ה foreach.

לולאת ה for:

לולאת ה for היא ללא ספק הלולאה האהובה עליי מכיוון שהיא לולאה אלגנטית ועצמאית.

התאהבתי בה בעת עבודתי עם JavaScript והרומן נמשך בעבודתי עם Java. התבנית (format) שלה היא המורכבת יותר משאר הלולאות אך מורכבות בתכנות בד"כ מרמזת על עוצמה רבה יותר (זה מה שאני מנסה לשכנע עצמי בד"כ…) , כך זה נראה: 

for ($i = 0; $i <= $#stuff; $i++) { print "$stuff[$i]"; }

 

בלולאת ה for אתה מגדיר משתנה אשר קיים אך ורק בלולאה. זה לא חייב בהכרח להקרא I$, אבל זה נקרא כך בגלל incremental ז"א משתנה הנועד לגדול בכל איטרציה. הגדרתי את המשתנה I$ להיות שווה ל 0. אח"כ אמרתי ללולאה להמשיך לרוץ כל עוד &I קטן או שווה למספר החריצים במערך stuff@. לאחר מכן הוריתי לו להוסיף 1 ל I$ בסוף כל מעבר דרך הלולאה. אח"כ הסקריפט צריך להדפיס את החריץ במערך stuff@ ש I$ מייצג. לכן במעבר הראשון של הלולאה יודפס [0]stuff$ , במעבר השני יודפס [1]stuff$. בצורה זו הלולאה תמשיך עד אשר התנאי לא יתקיים יותר. כמה שאני אוהב את זה , האישה המושלמת בעיניי היא אחת שרושמת לולאות for  קטלניות ומקשיבה לשירי ה pixies כל היום.

 

לולאת ה While:                                                                                                                                          לולאת ה while דומה ללולאת ה for אך אינה "עצמאית" (self-contained) , זה נראה כך:  

$stuff = <NAMES>; while ($stuff ne "bob") { print "$stuff"; $stuff = <NAMES>; }

קטע קוד זה מריץ את המשפט שבתוך הלולאה כל עוד המשתנה stuff$ לא שווה ל “bob . בלולאה מסוג זה ישנו הסיכון הגדול ביותר בכניסה ללולאה אינסופית, כי היא אינה מסתמכת על בדיקת ערך לעצירה כפי שעושה לולאת ה for. יתרה מכך, עליך להגדיר משתנה מחוץ ללולאה ולשנות ערכו בתוך הלולאה איפשהו (טריקי..)

לולאת Foreach:

לולאות Foreach הן די מגניבות , הן מעין גירסה עצלה של לולאת ה for , הנה , תעיף מבט בעצמך:

foreach $slotnum (@stuff) { print "$slotnum"; }

חריץ, חריץ בכל פעם , לולאה זו לוקחת את הערך הנמוך ביותר ושמה אותו ב slotnum$ אשר ישמש כמשתנה wild-card מאוחר יותר. לכן מערך stuff@ יתחיל מחריץ מספר 0 וילך כל הדרך לחריץ מספר 100 (אם יש כזה). או שיעצר אם יגמרו החריצים. לולאת ה Foreach הינה שימושית להרצה על מערכים אסוציאטיבים מכיוון שהחריצים שם אינם ממוספרים. התבונן בדוגמא הבאה: 

foreach $slotname (keys (%stuff)) { print "$stuff{$slotname}"; }

 

קטע קוד זה תופס את ערך המפתח של מערך stuff% ומתקדם לערך הבא בכל פעם. (כבר שכחת מהם מערכים אסוציאטיביים? חזור לעמוד 4 ולא תקנס). זה מתבצע בעזרת פונקציה קיימת של Perl הנקראת keys ואז מדפיס החוצה את הערך של כל חריץ. אל דאגה: עוד נגיע להדפסות ,

 בינתיים : wax on,wax off,wax on,wax off מעולה, אתה כמעט ומוכן ל Perl , אבל יש לך עדיין כמה מניפולציות ללמוד.

 

אופרטורים בפרל  | קצת מניפולציות