פרק 10: ניהול רשימות והאשים (Hashs)רשימה של רשימותמה היה קורה אם כל פריט ברשימה היה בעצמו רשימה? למעשה זה בהחלט אפשרי. קחו לדוגמא רשימת דגמי מכוניות של יצרן מכוניות אחד...לדוגמא "avalon", "camry" ו "celica". כמו כן יכולה להיות לנו עוד רשימה אחת של יצרן אחר כמו "accord, civic, prelude". אנו רוצים לשמור כל אחת מהרשימות הללו כפריטים של רשימה. כך יכול להראות איתחול של רשימה כזו: @carmodels=(["avalon","camry","celica"], ["accord","civic","prelude"], ["929","626","miata"]); ההגדרה של הרשימה carmodels היינה הגדרה של רשימה רגילה, אולם כל חפץ היינו רשימה בפני עצמה, המוכלת בתוך סוגריים מרובעים. התחביר, ובפרט באילו סוגרים להשתמש (מרובעים, עגולים, מסולסלים) ומתי, הופך קריטי בניהול האשים ורשימות. כיוון ש carmodels היינה רשימה בתוך רשימה, היא ידועה גם כמערך דו ממדי. על מנת לפנות לסקלר בודד ב carmodels אתם חייבים לספק שני ממדים: $carmodels[1][2] הסקלר הבא מתייחס לערך "prelude", שהוא פריט מספר שתים של הרשימה באינדקס 1 של carmodels. עתה נניח ואתם רוצים להוסיף עוד רשימה של דגמים ל carmodels - כלומר להוסיף עוד רשימה לרשימה. נוכל להשתמש בפונקציה push להוספת פריט חדש לרשימה, שימו לב לתחביר דחיפת (pushing) רשימה כפריט לרשימה: push(@carmodels,["sentra,stanza,altima"]); הסוגריים הריבועיים סביב הערכים הנדחפים (pushed) הינם קריטיים; אם לא תכתבו אותם, הערכים "sentra", "stanza", ו "altima"יוספו כערכים סקלריים בדידים ל carmodels, ולא כרשימה אחת. עתה דמיינו שאתם רוצים להוסיף עמודה לרשימה - משמע להוסיף פריט חדש לאחת מרשימות המימד השני, כגון "tercel" לרשימה באינדקס 0 (משמע הרשימה של טויוטה). push (@{$carmodels[0]},"tercel"); הקוד הופך מסובך עוד יותר! push דורשת רשימת יעד כפרמטר הראשון שלה, ואנו יודעים שהחפץ הראשון ברשימה carmodels הוא רשימה גם כן. הקוד הדרוש בכדי להבהיר זאת הוא, כמו שאתם רואים, {[listname[index$}@. במילים אחרות "הרשימה באינדקס בתוך הרשימה listname". התוצאה הסופית תהיה הוספת "tercel" לתוך הרשימה הראשונה מייד אחרי celica. בדומה לזאת, אנו משתמשים בבנאי ה {[listname[index$}@ בכדי לבצע פעולות על רשימה בתוך רשימה. הפעולה הבאה תעבור על כל הרשימות ותדפיס את כל רשימת דגמי המכוניות המוכלות בתוכן: #iterate over list of lists $index=0; foreach $modellist (@carmodels) { $index++; print "List index $index:\n"; foreach $model (@{$modellist}) {print "\t$model\n"} } עתה, כשהבנתם זאת, אתם ודאי שואלים את עצמכם, "כיצד אנו יכולים למיין רשימה בתוך רשימה? ומה המשמעות של זה?" טוב, המשמעות היא למיין את carmodels ע"פ הפריט הראשון בכל רשימה, ולאחר מכן מיון כל רשימה בתוך עצמה. הביצוע משלב את כל מה שלמדנו עד כה. שימו לב: #double-sort list of lists print "\nDouble-Sorted List of Lists:\n"; foreach $modellist (sort {@{$a}[0] cmp @{$b}[0]} @carmodels) {foreach $model (sort @{$modellist}) {print "$model "} print"\n";} נותן: 626 929 miata accord civic prelude avalon camry celica tercel altima maxima sentra אתם יכולים לראות שהתוצאות ממוינות בשני הממדים, בשורות ובעמודות. וזה בדיוק הזמן לקחת אספירין. כל
סוגי המיונים:טבלאות האש
|