logo


פרק 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

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

כל סוגי המיונים:טבלאות האש
תוכן עניינים
רשימה של האשים

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