logo


פרק ראשון: ה Perl שאתם צריכים לדעת

זרימת תוכניות ב Perl: משפטי תנאי ולולאות

כברירת מחדל, תוכניות בשפת Perl, כמו בשפות רבות נוספות, מבצעות את הקוד בסדר שבו הוא נכתב, מלמעלה למטה. סדר זה של הרצה מכונה בספרי הלימוד "זרימת תוכנית" ("program flow") , וישנן סיבות רבות מדוע נרצה בנסיבות מסוימות לשנות את צורת זרימת התוכנית. שוב, נשווה למקבילה בחיי היום יום-נגיד שאתם מתכננים את יומכם בסדר מסוים, אבל סיבות משתנות עלולות לשנות סדר זה. לדוגמא סדר יומכם עשוי להראות כך:

if (bank is open)
 { go to bank }
else 
 { go to grocery;
   go to bank }

השימוש בתנאים מאפשרת לסדר יומכם להיות הרבה יותר גמיש- לך לבנק בהתחלה, אם הוא פתוח, אחרת לך למכולת ואחר כך לך אל הבנק. בצורה דומה, אנו מישמים את אותה צורה של הגיון לזרימה של תוכניות ב Perl. שתי צורות השליטה העיקריות לשינוי זרימת תוכנית הם תנאים ולולאות.

תנאים, כמו if...else שראינו בדוגמא למעלה, מגדירים איזו פעולה לנקוט כאשר תנאי מסוים מתקיים או אינו מתקיים.

לולאות משמשות לחזרה פעם אחת או יותר על פעולה, וזאת ע"פ התנאי.

משפטי if ו unless

משפט התנאי הפשוט והשכיח ביותר הוא משפט ה if . אתם יכולים לקרוא דוגמה זו בקול על מנת שההיגיון יהיה ברור לחלוטין:

if (some condition)
   { ...do some actions when true... }

שימו לב שמשפט הפעולה נמצא בתוך סוגריים מסולסלים. קבוצה של סוגרים מסולסלים ידועה כ "גוש-פקודות" (statement block) , ויכולה להכיל כל כמות של פקודות Perl , בתנאי שהיא מופרדת ע"י נקודה-פסיק. אם נחזור לשניה לדוגמא שעסקה בהמרת מטבעות, אנו יכולים להדפיס לפלט הודעה: איזה מן המטבעות יותר יקר מהשני:

if ($USTotal>$CDNTotal)
 { print "Presently, the US dollar is ".
  "worth more than the Canadian dollar.\n" }

לצערנו, הדוגמא למעלה מעט פגומה, כי יכול להיות תיאורטית ששני המטבעות שווים. הצהרת elsif פועלת הן כ else והן כ if, ומאפשרת לתנאי ה else לבחון מצבים נוספים. דבר זה יהיה ברור יותר אם נתבונן בדוגמא הבאה:

if ($USTotal>$CDNTotal)
 { print "Presently, the US dollar is ". 
 "worth more than the Canadian dollar.\n" }
else
 { print "Presently, the Canadian dollar is ". 
 "worth more than the US dollar.\n" }
המשפט למעלה בוחן למעשה שני תנאים שים לב לדרך שבה שברנו את מחרוזת הפלט, לחלקים נפרדים. למרות שיכולנו לרשום אותה במשפט ארוך אחד, זה היה יוצר קושי לקרוא את המאמר בנוחות. כדי להפוך שורה זו ליותר קריאה, שברנו את מחרוזת הפלט לחלקים המחוברים ע"י אופרטור ההמשכיות "." , בין כל חלק. התוצאה כמובן היא זהה בדיוק להדפסה בשורה ארוכה
if ($USTotal>$CDNTotal)
 { print "Presently, the US dollar is ".
  "worth more than the Canadian dollar.\n" }
elsif ($USTotal==$CDNTotal)
 { print "Presently, both the US dollar and ".
  "the Canadian dollar are of equal value.\n" }
else 
 { print "Presently, the Canadian dollar is ".
  "worth more than the US dollar.\n" }

התוכנית למעלה בודקת בעצם שני תנאים: אם US dollar שווה יותר, אזי תודפס ההודעה הראשונה, לעומת זאת, אם השנים שווים תודפס ההודעה השניה, אם בתהליך זה יחזיר שלילה של שני התנאים, אזי חייב להתקיים ש US dollar שווה פחות, ולכן תודפס ההודעה השלישית.

כמה הערות תחביריות: העיצוב והעימוד של הדוגמאות שראינו היו בסה"כ בסגנון אחד, הסגנון שהמחבר החליט באופן אישי שהוא הקריא ביותר. מתכנתים אחרים עשוים להעדיף צורות אחרות של עימוד. Perl היא שפה מאוד גמישה, ובאופן עקרוני נותנת לך ליצור גושים של משפטים על משפטים בכל צורה שתרצה. כמו כן, שימו לב שהמילה elsif מאויתת בצורה מוזרה, בלי האות "e". עוד אחת מהשגעונות של שפת Perl.

וריאציה של הפקודה if היא הפקודת unless. פקודה זו בודקת האם תנאי נתון אינו נכון:

unless (bank is open) 
 { go to grocery;
   go to bank }
else 
 { go to bank;
   go to grocery }

ע"פ ההגיון של unless, אם הבנק אינו פתוח אזי נלך קודם לקניות, אחרת הבנק כנראה פתוח ולכן נלך לבנק תחילה. הפקודה unless יכולה להיות מבלבלת מבחינה מחשבתית, למרות שאם נחשוב עליה כ "אם התנאי אינו נכון" זה עשוי לעזור. בכל אופן אחר unless מתנהגת בדיוק כמו הפקודה if, ויכולה לקבל משפטי elsif ו/או פקודות else .

לולאות while,for,foreach

"להקציף, לשטוף, חזור" -ההוראות חסרות החשיבות שנמצאות על תווית בקבוק השמפו. בכל זאת, חתיכה זו של "חוכמת הניקוי" שופכת אור על אחת הטכניקות הבסיסיות ביותר בשפת Perl - הלולאה. למעשה, אנו יכולים ליצג את מנטרת השמפו תוך שימוש בלולאת while בPerl :

while (hairISgreasy)
 { lather;
   rinse }

לולאת השמפו, מתחילה בבדיקת התנאי: האם השיער שומני? בהמשך לבדיקה יש גוש-פקודות, וגוש זה יבוצע אם התנאי מחזיר אמת. לכן, אם השיער שומני, הקצף ושטוף. כאשר יגמרו כל הפקודות בגוש, לולאת ה while תחזור לבדיקה בראש הלולאה. האם השיער שומני? אם כן, הלולאה חוזרת שוב, עוד פעם להקציף ולשטוף. הלולאה תמשיך בצורה אין-סופית למעשה עד שהתנאי יחזיר שקר. אם, בחזרה השלישית, השיער כבר לא שומני, הלולאה תסתיים-הגוש-פקודות איננו מבוצע, וזרימת התוכנית עוברת לפקודה אחרי הגוש של פקודת ה while. אם התנאי בwhile הוא שלילי כבר בפעם הראשונה, גוש הפקודות לעולם לא יתבצע.

לולאת ה for דומה בטבעה ללולאת ה while אבל בדרך כלל נשתמש בה כאשר חשובה לנו הספירה.דוגמא בסיסית היא לולאת for הסופרת מ 1 ועד 10:

for ($j=1; $j<=10; $j++)
 { print "$j\n" }

פקודת for עושה כאן שלושה תפקידים: קודם כל, j=1 $ מגדירה את משתנה הספירה עבור לולאה זו, ומאתחלת אותו לערך 1. אתם יכולים להשתמש בכל שם משתנה שתרצו, אבל i$ ו j$ הם מונים מקובלים מסיבות היסטוריות ללולאות. החלק השני של השליטה בלולאת ה for הוא התנאי -- במקרה זה, הוא האם j$ קטן שווה לערך 10?. החלק השלישי של משפט הבקרה, מקדם את המונה. השתמשנו כאן באופרטור של הגדלה אוטומטית באחד, שפשוט מוסיף 1 לערך הנוכחי של j$.

במעבר הראשון על הלולאה, j$ מכילה את הערך 1, ולכן פקודת ה print תדפיס 1. במעבר השני על הלולאה j$ גדלה ל 2, והיא מושוות מול 10, ושוב פעם מודפסת ע"י פקודת print. תהליך זה חוזר על עצמו, עד ש j$ גדלה ל 11, שהוא, כמובן, מספר הגדול מ 10. בשלב זה יוצאים מהלולאה ו Perl עוברת על פני גוש הפקודות של הלולאה לגוש הפקודות הבא בתוכנית.

כאשר מתעסקים ברשימות, לולאת foreach מספקת דרך פשוטה לעבור דרך כל פריט ברשימה. זוכרים את רשימת המכולת שלנו מקודם, shopping@. הניחו שאתם רוצים לעבוד עם כל פריט ב shopping@:

foreach $shopping_item (@shopping)
 { do something with $shopping_item }

בלולאת foreach זו אין שום תנאי. לחלופין, היא חוזרת על כל פריט ברשימה shopping@. בכל מעבר, המשתנה shopping_item$ מכיל את הערך הבא ב shopping$ . לכן, במעבר הראשון על הלולאה shopping_item$ מכיל את"milk" , במעבר השני shopping_item$ מכיל את"bread" , וכך הלאה. בתוך גוש הפקודות של לולאת ה foreach אתם יכולים לשנות את הערך של shopping_item$ ,אם צריך, בלי להשפיע על הערך המקורי ב shopping@

Perl פונקציות ב
תוכן עניינים
סיכום

אודות
תוכן עניינים
פרק 1: ה Perl שאתם צריכים לדעת
מי מפחד מ Perl  
התקנת Perl  
הרצת תוכניות Perl  
משתנים ב Perl : סקלרים  
אופרטורים בסיסיים ב Perl  
משתני Perl: השוואת סקלרים  
אופרטורים של השוואה ב Perl  
משתני Perl: רשומות (ובשם נוסף: מערכים)  
משתני Perl: טבלאות האש  
פונקציות ב Perl  
זרימת תוכניות ב Perl  
סיכום  
פרק 2: קישור Perl לעמודי הרשת
פרק 3: שמירת מצב
פרק 4: HTML בחטף ותבניות (Templates) רשת
פרק 5: עיבוד וניתוח של עמודי רשת
פרק 6: להשתעשע עם בסיסי נתונים מקוונים:אקסס
פרק 7: המודל MySQL
פרק 8: להשתעשע בבסיסי נתונים - GUFE - החזית הכללית והשימושית
פרק 9: המילניום - ניהול זמן ותאריך
פרק 10: ניהול רשימות והאשים (Hashs)
פרק 11: הפניה להפניה
פרק 12: הכרות עם mod_perl