מערכים

pop#

מסיר ומחזיר את האיבר האחרון של מערך.

pop מקצר את המערך באחד ומוסר לכם את האיבר שהוסר. המערך משונה במקום. ללא ארגומנט, pop פועל על @_ בתוך תת־שגרה ועל @ARGV בכל מקום אחר - אותו יעד ברירת מחדל כמו של shift.

תקציר#

pop @arr
pop @$aref
pop                 # default: @_ inside a sub, @ARGV outside

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

האיבר שהוסר, כסקלר. אם המערך היה ריק, ערך־ההחזרה הוא undef והמערך נשאר ריק - זו אינה שגיאה ואינה פולטת אזהרה, ולכן קוד שתמיד קורא ל־pop בלולאה זקוק לבדיקת סיום משלו.

my @empty;
my $x = pop @empty;         # $x is undef, no warning

שימו לב ש־pop מחזיר undef גם כאשר האיבר האחרון היה undef. שני המקרים בלתי ניתנים להבחנה מערך־ההחזרה לבדו; השתמשו ב־@arr בהקשר בוליאני, או scalar @arr, כדי להבחין ביניהם לפני הביצוע של pop.

my @arr = ('one', 'two', undef);
my $x = pop @arr;           # $x is undef - but so would an empty pop be

מצב גלובלי שהוא נוגע בו#

pop ללא ארגומנט קורא את @_ (בתוך תת־שגרה) או את @ARGV (בתחום קובץ, בבלוקי BEGIN/INIT/CHECK/END, ובתוך eval STRING). הוא אינו מקיים אינטראקציה עם $_, $,, $\, או כל משתנה פיסוק אחר.

דוגמאות#

שימוש בסיסי - משיכת האיבר האחרון ממערך רגיל:

my @arr  = ('cat', 'dog', 'mouse');
my $item = pop @arr;        # $item is 'mouse'
# @arr is now ('cat', 'dog')

מחסנית LIFO - push להוספה, pop להסרה, שניהם באותו קצה:

my @stack;
push @stack, 'a';
push @stack, 'b';
push @stack, 'c';
my $top = pop @stack;       # 'c'; @stack is ('a', 'b')

השליכו את האיבר האחרון כשאינכם צריכים את ערכו. pop בהקשר void תקף לחלוטין והוא הדרך האידיומטית להפיל את הזנב:

pop @arr;                   # shorten @arr by one, value thrown away

יעד ברירת מחדל בתוך תת־שגרה - pop ללא ארגומנט שולף מ־@_, וזו הדרך שבה sub מקלף את הארגומנט האחרון שלו מרשימת הארגומנטים:

sub last_arg {
    return pop;             # pops from @_
}
last_arg(1, 2, 3);          # returns 3

ביצוע pop דרך הפניה למערך. בצעו dereference עם @$aref (או @{ $aref } לכל ביטוי לא־טריוויאלי) ו־pop פועל בדיוק כמו על מערך בעל שם:

my $aref = [10, 20, 30];
my $x    = pop @$aref;      # 30; $aref now points to [10, 20]

מקרי קצה#

  • מערך ריק מחזיר undef, לא שגיאה. אין אזהרה, אפילו תחת use warnings. לולאה מהצורה while (defined(my $x = pop @arr)) { ... } מסתיימת בריק או באיבר undef אמיתי - השתמשו ב־while (@arr) במקום זאת אם המערך עשוי להכיל undef באופן לגיטימי.

  • ביטוי bareword במקום ARRAY. pop דורש מערך, לא ביטוי שרירותי. pop @$aref פועל מכיוון ש־@$aref הוא תחביר מערך; pop $aref הותר לפרק זמן קצר כניסוי בין 5.14 ל־5.22 והוא שגיאת הידור מאז 5.24. תמיד כתבו את ה־sigil המפורש @ על ה־dereference.

  • מערכים קשורים. pop @tied קורא למתודה POP של המחלקה הקשורה אם הוגדרה; אחרת חל הנפילה־לאחור ברירת המחדל של FETCHSIZE + FETCH + DELETE + STORESIZE. תופעות הלוואי של אותן מתודות מופעלות בסדר הזה.

  • pop מקצר את המערך. לאחר pop @arr, $#arr יורד באחד ו־scalar @arr יורד באחד. אם אתם צריכים לבחון את הזנב מבלי להסיר אותו, קראו את $arr[-1] או $arr[$#arr] ישירות - ראו $#arr ב־perlvar.

  • צורה ללא־ארגומנט משנה משמעות לפי תחום. בתחום קובץ, pop; משמעו pop @ARGV. בתוך תת־שגרה משמעו pop @_. אותה שורת מקור מתנהגת אפוא באופן שונה תלוי היכן היא מופיעה - הפתעה נפוצה כאשר קוד עובר refactor פנימה או החוצה מ־sub. כתבו את היעד באופן מפורש (pop @ARGV או pop @_) בכל פעם שהכוונה אינה ברורה מההקשר.

  • pop על מערך הממוסך דרך @_. ארגומנטים של תת־שגרה הם כינויים לערכים של הקורא. pop @_ מסיר את ערך הכינוי מ־@_ אך אינו מקצר את המערך של הקורא; כדי לכווץ את המערך של הקורא חייבים להעביר ל־sub את המערך לפי הפניה ולהשתמש ב־pop @$aref במקום זאת.

הבדלים מ־upstream#

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

ראו גם#

  • push - המקבילה; מוסיף לאותו קצה של המערך ש־pop מסיר ממנו

  • shift - מסיר ומחזיר את האיבר הראשון; אותם כללי ברירת מחדל כמו pop (@_ ב־sub, @ARGV אחרת)

  • unshift - מוסיף לחזית; משויך עם shift כמו ש־push משויך עם pop

  • splice - מסיר או מחליף פריסה שרירותית; splice @arr, -1 היא הצורה הארוכה של pop @arr

  • last - מילת מפתח לבקרת לולאה, ללא קשר לקצה המערך; מצוין מכיוון שהשמות מבולבלים לעיתים קרובות

  • $#arr - האינדקס האחרון של @arr; משתנה כש־pop מקצר את המערך