ביצוע התאמות (תמצית העיקר).

כעת אחרי שריסקת את הקלט של המשתמש הגיע הזמן להחזיר לו משהו בתמורה. הדפסה לעמוד Web היא בדיוק כמו הדפסה לפלט הסטנדרטי , מלבד הזה שאתה יכול להשתמש בתוויות (HTML tags). הדבר היחיד שעליך לעשות כאשר אתה מדפיס לעמוד Web זה לומר לדפדפן מה הוא הולך לקבל. במקרה זה הוא מקבל HTML , ולכן עליך להוסיף:  

Content-Type: text/html\n\n

… בקטע הראשון בו אתה הולך להדפיס למשתמש. המשתמש לא יבחין בכך אך הדפדפן כן – וזה דבר חשוב מאוד. (עליך לוודא כי אתה שולח זאת רק בהדפסה הראשונה אחרת המשתמש באמת יראה זאת וזה יהיה די מביך לראות את :  

Content-Type: text/html\n\n

מודפס אלפי פעמים על כל העמוד.)

ובכן את הכותרת העליונה (header) של התוצאות שלנו נכתוב כך:

print <<END; Content-Type: text/html\n\n <html> <body bgcolor="#000000" text="#ffffff"> <center> <h2>Results</h2> </center> <p> END

שים לב כי השתמשתי בHTML בתוך ה CGI שלי. זה בדיוק כמו לכתוב דף HTML נורמלי במקטעים , מלבד הדבר שזה נעשה עם תוייות הדפסה (print tags).

אני יכול לסבך זאת ככל שיעלה על רוחי ולהשתמש בכל תווית (HTML tag) הנמצאת בספר אבל אנו לומדים CGI ולא HTML ולכן לא אעשה זאת אלא רק במינימום ההכרחי.

אוקיי, הרכבנו את הכותרת העליונה (header). אך עדיין לא הגענו לבשר עצמו (או לתפו"א אם אתה צמחוני…) של הסקריפט. עדיין עלינו להציג את האינפורמציה שהמשתמש ביקש. עד כה יש לנו את מידע המשתמש במשתנה אחד ומסד הנתונים מאוחסן במערך משתנים. כעת עלינו לרוץ על המערך ולנסות לבצע התאמה בין הכותרות (titles  של הסרט). אם הכותרת מתאימה , נדפיס החוצה את המידע, אם לאו – נדפיס החוצה הודעת שגיאה.

מהי הדרך הטובה ביותר לרוץ על פני מערך? ובכן אתה יכול להשתמש בלולאת for או בלולאת foreach , אני אישית מעדיף את לולאת for  ולכן אשתמש בה , למרות ששתיהן אפשריות לצורך כך.

for ($i = 0; $i <= $#data; $i++) { }

קטע זה רץ על החריצים ב data@ עד אשר לא נותרים יותר חריצים. ואז מסיים. כעת עלינו לבדוק האם הכותרת מאוחסנת במערך.  

if ($data[$i] =~ /-- $movie{'title'} --/i) { }

אם ישנה התאמה נשתמש במשהו כזה (בתוך ה if) :  

print <<END; <b><font size="+1">$data[$i + 1]</font></b><br> $data[$i + 2]<br> END last;

מה שעשינו כאן זה למצוא את הכותרת הנכונה על ידי שימוש בקוים מפרידים (line of dashes) אשר שמתי בתצורה של קבצי מסד הנתונים שלי – זו שורה i$. התוכן האמיתי שנרצה להציג : הכותרת וביקורת הסרט (review) נמצאים 2 שורות אחרי הקו המפריד (dashed line). נדפיס תוכן זה על ידי הוספת 1 או 2 למשתנה i$. שוב אנו עוטפים את הפלט בתצורת HTML על מנת לעשות זאת יפה. ולכן אם הקו המפריד היה בשורה 32 המשתנה i$ יאותחל ל32. על מנת לקבל את כותרת הסרט ללא הקו המפריד עליך להוסיף 1 ל i$ מפני שזה בשורה מתחת:שורה 33. על מנת לקבל את ביקורת הסרט (review) אשר נמצא בשורה השלישית של מסד הנתונים שלי , שורה 34 , עליך להוסיף 2 ל i&  באופרטור מתמטי ולא אופרטור השמה. ולכן ערך i$ ישאר שווה ל 32. ברגע שהדפסנו את המידע ישנו שימוש בהוראה "last" על מנת לומר לסקריפט שהוא קיבל מה שהיה צריך. ביסודו "last" אומר ללולאה שהמעבר הבא הוא האחרון ולכן יש לבצע break ולצאת מהלולאה.

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

if ($data[$i] =~ /-- $movie{'title'} --/i) { print <<END; <b><font size="+1">$data[$i + 1]</font></b><br> $data[$i + 2]<br> END last; } elsif ($i == $#data) { }

קטע קוד זה אומר שאם i$ שווה למספר החריצים ב data@ והכותרת לא נמצאה בחריץ זה אז עשה כך וכך. אבל מהו כך וכך? תמיד עדיף פשוט לומר למשתמש כי אין לך את מה שהוא חיפש מאשר לשקר לו. כמובן שההחלטה הסופית תלויה בך.ולכן בין הסוגריים זה המקום בו אתה מסביר מדוע החיפוש לא הניב תוצאות.  

print "<b><i>Sorry! I haven't reviewed that one yet!</i></b>";

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

                                                                                                   

for ($i = 0; $i <= $#data; $i++) { if ($data[$i] =~ /-- $movie{'title'} --/i) { print <<END; <b><font size="+1">$data[$i + 1]</font></b><br> $data[$i + 2]<br> END last; } elsif ($i == $#data) { print "<b><i>Sorry! I haven't reviewed that one yet!</i></b>"; } }

ולסיום עליך להוסיף כותרת תחתונה (footer) בדיוק כפי שעשית עם כותרת עליונה (header):  

print <<END; <center><hr size=1 width=50%></center> </body> </html> END

עושים סדר בקלט  | איזהו סקריפט סי.ג'י.איי נפלא