Πίνακες

push#

Προσαρτά μία ή περισσότερες τιμές στο τέλος ενός πίνακα.

Η push προσθέτει κάθε στοιχείο της LIST στο τέλος του ARRAY, με τη σειρά. Είναι το ζευγαρωμένο αντίστοιχο της pop στην ουρά και των unshift / shift στην κεφαλή. Ο πίνακας μεγαλώνει επιτόπου· δεν επιστρέφεται νέος πίνακας.

Σύνοψη#

push @arr, $val
push @arr, @more
push @arr, list, of, values
push @$aref, $val

Τι επιστρέφεται#

Ο νέος αριθμός στοιχείων του ARRAY μετά την προσάρτηση - δηλαδή το scalar @arr όπως διαμορφώνεται μόλις επιστρέψει η push. Όχι οι ωθημένες τιμές, όχι το παλιό μήκος, όχι ο ίδιος ο πίνακας.

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

Χρήσιμο όταν η push και ο επακόλουθος έλεγχος μήκους θα ήταν διαφορετικά δύο δηλώσεις:

if (push @queue, $job > $limit) { ... }  # one call, count + test

Παραδείγματα#

Βασική προσάρτηση μίας τιμής:

my @animals = ("cat");
push @animals, "mouse";                   # ("cat", "mouse")

Προσάρτηση πολλαπλών τιμών σε μία κλήση - κάθε όρισμα γίνεται δικό του στοιχείο:

my @colors = ("red");
push @colors, "blue", "green";            # ("red", "blue", "green")

Προσάρτηση των περιεχομένων άλλου πίνακα. Ο δεύτερος πίνακας ισοπεδώνεται στη λίστα, οπότε προσαρτώνται τα στοιχεία του, όχι ο πίνακας ως μονό στοιχείο:

my @a = (1, 2);
my @b = (3, 4);
push @a, @b;                              # (1, 2, 3, 4)

Πειθαρχία ουράς - push στην ουρά, shift στην κεφαλή:

my @queue;
push @queue, $job;                        # enqueue
my $next = shift @queue;                  # dequeue

Πειθαρχία στοίβας - push και pop στο ίδιο άκρο:

my @stack;
push @stack, $frame;                      # enter
my $top = pop @stack;                     # leave

Push σε πίνακα που κρατείται μέσω αναφοράς. Η αναφορά πρέπει να αποαναφερθεί με @{ ... } (ή τη σύντομη μορφή @$ref) πριν η push δει πίνακα:

my $aref = [1, 2];
push @$aref, 3;                           # $aref now refers to [1, 2, 3]
push @{ $aref }, 4, 5;                    # same, explicit deref

Μέτρηση στοιχείων μετά την προσάρτηση χωρίς προσωρινή μεταβλητή:

my $size = push @log, $entry;
warn "log is large: $size entries" if $size > 1000;

Οριακές περιπτώσεις#

  • Το arrayref χρειάζεται αποαναφορά. Το push $ref, $x είναι σφάλμα μεταγλώττισης στην Perl 5.24+. Χρησιμοποιήστε push @$ref, $x ή push @{ $ref }, $x. Ένα πειραματικό χαρακτηριστικό επέτρεπε βαθμωτό πρώτο όρισμα στις 5.14–5.22 και αφαιρέθηκε· μην βασίζεστε σε αυτό.

  • Τα ορίσματα πίνακα ισοπεδώνονται αυτόματα. Η push @a, @b προσαρτά τα στοιχεία του @b μεμονωμένα. Για να προσαρτήσετε το @b ως μία εμφωλευμένη εγγραφή χρειάζεστε arrayref: push @a, \@b ή push @a, [ @b ].

  • Και τα ορίσματα hash ισοπεδώνονται. Η push @a, %h προσαρτά εναλλάξ κλειδιά και τιμές με τη σειρά επανάληψης του hash - σχεδόν ποτέ αυτό που θέλετε. Χρησιμοποιήστε push @a, \%h για να αποθηκεύσετε το hash μέσω αναφοράς.

  • Περιβάλλον λίστας αλλά βαθμωτή επιστροφή. Η push τεκμηριώνεται ότι δέχεται LIST και επομένως αποτιμά τα ορίσματά της σε περιβάλλον λίστας, αλλά η τιμή που η ίδια η push παράγει είναι πάντα ο προκύπτων αριθμός. Μέσα σε print push @a, @b εκτυπώνεται ο αριθμός, όχι ο πίνακας.

  • Κενή LIST. Η push @a; (χωρίς δεύτερο όρισμα) είναι no-op και επιστρέφει το τρέχον scalar @a. Νόμιμη και περιστασιακά χρήσιμη για το «δώσε μου τον αριθμό χωρίς να τροποποιήσεις τίποτα» - αν και το scalar @a είναι σαφέστερο.

  • Tied πίνακες. Η push σε tied πίνακα καλεί την PUSH στο tied αντικείμενο αν είναι ορισμένη· διαφορετικά καταφεύγει σε επαναλαμβανόμενες κλήσεις STORE σε θέσεις παραγόμενες από FETCHSIZE. Δείτε το perltie.

  • Αυτο-δημιουργία. Η push μέσω αναφοράς με τιμή undef δημιουργεί έναν ανώνυμο πίνακα:

    my %index;
    push @{ $index{$key} }, $value;         # $index{$key} becomes an arrayref
    

    Μετά την πρώτη push, το $index{$key} κρατά arrayref που περιέχει το $value. Αυτό είναι το τυπικό ιδίωμα για τη σταδιακή δόμηση ενός hash-of-arrays.

  • Πίνακας μόνο για ανάγνωση. Η push σε πίνακα μόνο για ανάγνωση ή σταθερού μεγέθους (π.χ. στοιχείο του @_ δεσμευμένο σε μεταβλητή του καλούντος, ή πίνακας κλειδωμένος με Hash::Util::lock_value) εγείρει Modification of a read-only value attempted.

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

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

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

  • pop - αφαιρεί και επιστρέφει το τελευταίο στοιχείο· ζευγαρωμένη με την push σχηματίζει στοίβα

  • shift - αφαιρεί και επιστρέφει το πρώτο στοιχείο· ζευγαρωμένη με την push σχηματίζει ουρά

  • unshift - η κατοπτρική εικόνα της push στην κεφαλή του πίνακα· επιστρέφει το νέο μήκος με τον ίδιο τρόπο

  • splice - εισαγωγή, αφαίρεση, ή αντικατάσταση οποιουδήποτε εύρους· η push @a, @b είναι ισοδύναμη με splice @a, scalar @a, 0, @b

  • scalar - επιβολή βαθμωτού περιβάλλοντος σε πίνακα όταν θέλετε τον αριθμό χωρίς push

  • @ARGV - ο κανονικός πίνακας στον οποίο τα περισσότερα προγράμματα κάνουν push ή τον καταναλώνουν με shift