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- הפעולה ההפוכה: מסיר ומחזיר את האיבר הראשוןsplice- הוספה/הסרה למטרות כלליות במיקום שרירותי;unshift @a, LISTשקול ל־splice(@a, 0, 0, LIST)reverse- שייכו עםunshiftכשאתם כן רוצים שהערכים שנוספו בראש יסתיימו בסדר הפוךList::Util- איןprependייעודי; עבור סמנטיקת הוספה־בראשunshiftהוא הכלי האידיומטי, ו־List::Util::pairs/List::Util::zipמתרכבים איתו כאשר אתם משנים מבנה של צורות רשימה במקום פשוט להוסיף לאחת