Πίνακες

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 δέχεται αποαναφορημένο πίνακα στην αριστερή πλευρά:

my $ref = [10, 20, 30];
unshift @$ref, 0;
# $$ref[0] is now 0, @$ref is (0, 10, 20, 30)

Η μορφή αποαναφοράς με βέλος λειτουργεί με τον ίδιο τρόπο· γράψτε την αποαναφορά ως ξεχωριστή έκφραση αντί να εκτείνετε αλυσίδα μεθόδων κατά μήκος του ορίσματος της 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, αλλά κάθε κλήση ξαναγράφει κάθε δείκτη.

  • Ο αποαναφορημένος πίνακας δουλεύει: η unshift @$ref, $x τροποποιεί επιτόπου τον πίνακα στον οποίο αναφέρεται το $ref. Η unshift @{ $h{key} }, $x αυτο-δημιουργεί το $h{key} σε κενή αναφορά πίνακα αν δεν υπήρχε προηγουμένως.

  • Βαθμωτή έκφραση στην αριστερή πλευρά είναι συντακτικό σφάλμα. Ένα πείραμα της Perl 5.14 δέχτηκε για λίγο unshift $scalar, ... με σημασία «θεώρησε το $scalar ως αναφορά πίνακα και προπένθεσε»· αφαιρέθηκε στην Perl 5.24 και παραμένει αφαιρεμένο. Γράφετε unshift @$scalar, ....

  • Η τιμή επιστροφής σε βαθμωτό έναντι περιβάλλοντος λίστας είναι ο ίδιος ακέραιος. Σε αντίθεση με πολλές ενσωματωμένες, η unshift δεν συμπεριφέρεται διαφορετικά σε περιβάλλον λίστας - επιστρέφει πάντα το νέο μήκος.

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

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

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

  • push - η άλλη άκρη: προσαρτά στην ουρά του πίνακα και επιστρέφει το νέο μήκος

  • shift - η αντίστροφη πράξη: αφαιρεί και επιστρέφει το πρώτο στοιχείο

  • pop - συμμετρικός σύντροφος της shift, αφαιρεί από την ουρά

  • splice - γενικής χρήσης εισαγωγή/αφαίρεση σε αυθαίρετη θέση· η unshift @a, LIST είναι ισοδύναμη με splice(@a, 0, 0, LIST)

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

  • List::Util - δεν διαθέτει ειδική prepend· για σημασιολογία εισαγωγής στην κεφαλή η unshift είναι το ιδιωματικό εργαλείο, και οι List::Util::pairs / List::Util::zip συνθέτονται μαζί της όταν αναδιαρθρώνετε σχήματα λίστας αντί να απλώς προσθέτετε σε μία