פרק 10: ניהול רשימות והאשים (Hashs)כל סוגי המיונים: טבלאות האשקודם לכן אמרנו שבטבלאות האש אין סדר, ומזה נובע שלא ניתן למיין אותן. זה נכון, אבל אולי נרצה למיין את המפתחות או/ו את הערכים שבתוך ההאש, דבר הניתן לביצוע אם נתייחס למפתחות או לערכים כרשימות בפני עצמן. ובשלב זה עדיף לתת דוגמה: נתבונן בהאש דמיוני המכיל שמות מוצרים כמפתחות, ומחירי מוצרים המהווים ערכים. %prices=("deluxe gizmo"=>24.99, "ultimate gizmo"=>49.99, "standard gizmo"=>19.99, "ultra gizmo"=>31.99); נניח ואנו רוצים לפלוט את המוצרים ואת המחירים המצויים בהאש, כאשר הם ממוינים מהזול אל היקר? כמו שנאמר, איננו יכולים לשלוט בסדר הפנימי של ההאש, אולם אין לנו צורך בשליטה כזו. במקום זה, אנו יכולים להשתמש בפונקצית ה keys לשליפת המפתחות של ההאש לרשימה, למיין אותם ע"פ ערכי ההאש שלהם, ולפלוט את התוצאות. foreach $item (sort {$prices{$a}<=>$prices{$b} } keys %prices) {print "$item: \$$prices{$item}\n"}; נותן: standard gizmo: $19.99 deluxe gizmo: $24.99 ultra gizmo: $31.99 ultimate gizmo: $49.99 הוראת ה foreach מתכוננת לפעול על רשימה. איזה רשימה? הפונקציה (keys (%prices מחזירה רשימת מפתחות של ההאש prices, אשר מכילה בתוכה את "deluxe gizmo", "standard gizmo", , וכו'. הרשימה ממוינת ע"י פונקצית ה sort, בעזרת קוד מיון שאנו מספקים. קוד המקור שלנו משתמש בהאש בכדי להתבונן בערך של המפתח a$, ומשווה אותו לערך של מפתח b$. כתוצאה מכך, ערכי המפתח ממוינים ע"י הקישור לערכיהם. הוראת ה print מדפיסה את המפתחות בצרוף ערכיהם הנשלפים מההאש. היבט נוסף של אותו נושא הוא השימוש בהאש על מנת למיין רשומה ע"פ תדירויות המופע שלה. למשל, נניח ויש לנו רשימת שמות משפחה ארוכה, ואנו רוצים למיינה ע"פ מספר המופעים של כל שם. פעולה זו פשוטה למדי הודות לההאש, בנוסף היא מאפשרת גם "דיכוי כפולים" ברשימה. דמיינו לעצמכם את הרשימה הבאה: @surnames=("jones","harris","stein", "harris","norman","jones","harris"); אנו יכולים לרוקן האש מסוים, ואז ע"י ביצוע איטרציות על רשימת ה surnames להוסיף כל מפתח להאש. %surname_freq=(); foreach $surname (@surnames) {$surname_freq{$surname}++} השם הראשון ברשימה הוא "jones", ולכן "jones" הופך למפתח בהאש surname_freq. הערך שלו נקבע ע"י אופרטור ההוספה, אשר מוסיף אחד לערך. כיוון שלמפתח הנ"ל אין ערך (משמע אפס) ערכו לאחר ההוספה הוא 1. תהליך דומה קורה לכל שם ברשימה. כאשר נסיים יהיה לנו האש שבו למפתח "harris" יש ערך 3. עתה אפשר לפלוט את ההאש באותה טכניקה בה השתמשנו בדוגמת ה gizmo, משמע ייצור רשימת תדירויות יורדת וכן רשימה בלא כפולים. foreach $surname (reverse sort {$surname_freq{$a}<=>$surname_freq{$b} } keys %surname_freq) {print "$surname: frequency $surname_freq{$surname}\n";} תשומת לב לפרטים הקטנים קריטית בקטע זה. כאן, אנו מושכים את רשימת המפתחות ב surname ומבצעים מיון הפוך שלהם ע"פ תדירויות המופע, ולבסוף מדפיסים את התוצאות. כל סוגי המיונים:רשימות
|