Πίνακες

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 σε κενό περιβάλλον είναι απολύτως έγκυρη και είναι ο ιδιωματικός τρόπος να εγκαταλείψετε την ουρά:

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

Προεπιλεγμένος στόχος μέσα σε υπορουτίνα - η pop χωρίς όρισμα κάνει pop από το @_, και έτσι μια υπορουτίνα ξεφλουδίζει το τελευταίο της όρισμα από τη λίστα ορισμάτων:

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

Pop μέσω αναφοράς πίνακα. Κάντε αποαναφορά με @$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 @ στην αποαναφορά.

  • Δεμένοι πίνακες. Η pop @tied καλεί τη μέθοδο POP της δεμένης κλάσης αν είναι ορισμένη· αλλιώς ισχύει η προεπιλεγμένη υποχώρηση FETCHSIZE + FETCH + DELETE + STORESIZE. Οι παρενέργειες αυτών των μεθόδων πυροδοτούνται με αυτή τη σειρά.

  • Η pop συντομεύει τον πίνακα. Μετά την pop @arr, η $#arr μειώνεται κατά ένα και η scalar @arr πέφτει κατά ένα. Αν χρειάζεται να επιθεωρήσετε την ουρά χωρίς να την αφαιρέσετε, διαβάστε απευθείας $arr[-1] ή $arr[$#arr] - δείτε την $#arr στο perlvar.

  • Η μορφή χωρίς όρισμα αλλάζει σημασία ανάλογα με την εμβέλεια. Σε εμβέλεια αρχείου, η pop; σημαίνει pop @ARGV. Μέσα σε υπορουτίνα σημαίνει pop @_. Η ίδια λοιπόν γραμμή πηγαίου κώδικα συμπεριφέρεται διαφορετικά ανάλογα με το πού εμφανίζεται - μια συνηθισμένη έκπληξη όταν κώδικας αναδιαρθρώνεται μέσα σε ή έξω από υπορουτίνα. Γράφετε ρητά τον στόχο (pop @ARGV ή pop @_) όποτε η πρόθεση δεν είναι προφανής από το περιβάλλον.

  • Η pop σε πίνακα με ψευδωνυμοποίηση μέσω @_. Τα ορίσματα υπορουτίνας είναι ψευδώνυμα προς τις τιμές του καλούντος. Η pop @_ αφαιρεί την εγγραφή ψευδωνύμου από το @_ αλλά δεν συντομεύει τον πίνακα του καλούντος· για να συρρικνώσετε τον πίνακα του καλούντος, η υπορουτίνα πρέπει να δεχθεί τον πίνακα μέσω αναφοράς και να χρησιμοποιηθεί pop @$aref αντί γι” αυτό.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • push - το αντίστοιχο· προσαρτά στο ίδιο άκρο του πίνακα από όπου αφαιρεί η pop

  • shift - αφαιρεί και επιστρέφει το πρώτο στοιχείο· ίδιοι κανόνες προεπιλογής με την pop (@_ σε υπορουτίνα, αλλιώς @ARGV)

  • unshift - προπενθέτει στην κεφαλή· ζευγαρωμένη με την shift όπως η push είναι ζευγαρωμένη με την pop

  • splice - αφαιρεί ή αντικαθιστά αυθαίρετο τμήμα· η splice @arr, -1 είναι η εκτενής μορφή της pop @arr

  • last - δεσμευμένη λέξη ελέγχου βρόχου, άσχετη με το τέλος πίνακα· αναφέρεται επειδή τα ονόματα συχνά συγχέονται

  • $#arr - τελευταίος δείκτης του @arr· αλλάζει όταν η pop συντομεύει τον πίνακα