מערכים

unshift#

מוסיף ערך אחד או יותר לתחילת מערך ומחזיר את האורך החדש של המערך.

unshift הוא תמונת המראה של push: בעוד ש־push מוסיף בזנב, unshift מוסיף בראש. הערכים ב־LIST נוספים כקבוצה, בסדר הנתון, כך שהארגומנט הראשון של LIST הופך לאיבר 0 החדש, השני הופך לאיבר 1, וכן הלאה, כשהתוכן המקורי מחליק לאינדקסים גבוהים יותר.

תקציר#

unshift @arr, $val
unshift @arr, @more
unshift @arr, $first, $second, $third

מה מקבלים בחזרה#

המספר החדש של איברים במערך, כמספר שלם. זהו אותו ערך שהייתם מקבלים מ־scalar @arr לאחר הקריאה.

my @colors = ("red");
my $n = unshift @colors, "blue", "green";   # $n == 3

רוב הקריאות משליכות את ערך־ההחזרה; הוא שימושי לעיתים כאשר אתם רוצים להוסיף בראש ולהסתעף לפי הגודל התוצאתי בצעד אחד.

דוגמאות#

הוספת איבר יחיד בראש:

my @animals = ("cat");
unshift @animals, "mouse";
# @animals is now ("mouse", "cat")

הוספת מספר איברים בראש - הסדר נשמר, לא הפוך. זהו הבלבול הנפוץ ביותר עם unshift:

my @a = (10, 20, 30);
unshift @a, 1, 2, 3;
# @a is now (1, 2, 3, 10, 20, 30)
# NOT (3, 2, 1, 10, 20, 30)

אם אתם באמת רוצים שהערכים שנוספו בראש יהיו הפוכים, הפכו אותם באופן מפורש:

my @a = (10, 20, 30);
unshift @a, reverse(1, 2, 3);
# @a is now (3, 2, 1, 10, 20, 30)

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

my @head = ("a", "b");
my @tail = ("c", "d");
unshift @tail, @head;
# @tail is now ("a", "b", "c", "d")

הוספה בחזית מול הוספה באחור. שתי הקריאות הללו מפיקות תוצאות תמונת־מראה על אותו מערך התחלתי:

my @x = (2, 3);
push    @x, 4;      # @x is (2, 3, 4)   - 4 goes to the rear
unshift @x, 1;      # @x is (1, 2, 3, 4) - 1 goes to the front

עבודה על מערך דרך הפניה. unshift מקבל מערך מ־dereferenced משמאל:

my $ref = [10, 20, 30];
unshift @$ref, 0;
# $$ref[0] is now 0, @$ref is (0, 10, 20, 30)

צורת ה־arrow-deref פועלת באותה דרך; כתבו את ה־deref כביטוי משלו במקום למתוח שרשרת מתודות על־פני הארגומנט של unshift:

my @list = @$ref;
unshift @list, -1;

מקרי קצה#

  • העלות היא O(n). כל איבר קיים מוזז למעלה ב־scalar(LIST) חריצים, ולכן הוספה בראש למערך גדול יקרה בפרופורציה. אם אתם בונים רשימה על־ידי הוספות חוזרות בראש, בנו אותה עם push ו־reverse בסוף - או בנו אותה הפוך עם אינדקסים - במקום unshift בלולאה.

  • הרשימה נוספת בראש בשלמותה, לא הפוך. unshift @a, 1, 2, 3 מציב את 1 באינדקס 0, את 2 באינדקס 1, את 3 באינדקס 2. קוראים שמגיעים משפות שבהן ״push לחזית״ הופך באופן טבעי (מכיוון שכל איבר הופך לראש החדש) לעיתים קרובות מצפים להפך; Perl לא.

  • LIST ריק הוא no-op. unshift @arr ללא דבר אחריו מותיר את המערך ללא שינוי ומחזיר את ספירת האיברים הנוכחית.

  • מערכים קשורים: unshift על מערך קשור קורא למטפל UNSHIFT אם החבילה מספקת אחד; אחרת הוא חוזר לרצף של קריאות SPLICE או STORE / STORESIZE. מחלקת tie שמיישמת רק FETCH ו־STORE עדיין יכולה לעבור unshift, אך כל קריאה כותבת מחדש כל אינדקס.

  • מערך מ־dereferenced פועל: unshift @$ref, $x משנה את המערך שאליו מתייחס $ref במקום. unshift @{ $h{key} }, $x מבצע autovivify ל־$h{key} להפניית מערך ריקה אם הוא לא היה קיים קודם.

  • ביטוי סקלר משמאל הוא שגיאת תחביר. ניסוי של Perl 5.14 קיבל לפרק זמן קצר unshift $scalar, ... שמשמעו ״התייחסו ל־$scalar כהפניית מערך והוסיפו בראש״; הוא הוסר ב־Perl 5.24 ונשאר מוסר. כתבו unshift @$scalar, ....

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

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • push - הקצה השני: מוסיף לזנב המערך ומחזיר את האורך החדש

  • shift - הפעולה ההפוכה: מסיר ומחזיר את האיבר הראשון

  • pop - שותף סימטרי ל־shift, מסיר מהזנב

  • splice - הוספה/הסרה למטרות כלליות במיקום שרירותי; unshift @a, LIST שקול ל־splice(@a, 0, 0, LIST)

  • reverse - שייכו עם unshift כשאתם כן רוצים שהערכים שנוספו בראש יסתיימו בסדר הפוך

  • List::Util - אין prepend ייעודי; עבור סמנטיקת הוספה־בראש unshift הוא הכלי האידיומטי, ו־List::Util::pairs / List::Util::zip מתרכבים איתו כאשר אתם משנים מבנה של צורות רשימה במקום פשוט להוסיף לאחת