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משויך עםpopsplice- מסיר או מחליף פריסה שרירותית;splice @arr, -1היא הצורה הארוכה שלpop @arrlast- מילת מפתח לבקרת לולאה, ללא קשר לקצה המערך; מצוין מכיוון שהשמות מבולבלים לעיתים קרובות$#arr- האינדקס האחרון של@arr; משתנה כש־popמקצר את המערך