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- η αντίστροφη πράξη: αφαιρεί και επιστρέφει το πρώτο στοιχείοsplice- γενικής χρήσης εισαγωγή/αφαίρεση σε αυθαίρετη θέση· ηunshift @a, LISTείναι ισοδύναμη μεsplice(@a, 0, 0, LIST)reverse- συνδυάστε με τηνunshiftόταν θέλετε οι προπενθεμένες τιμές να καταλήξουν σε αντίστροφη σειράList::Util- δεν διαθέτει ειδικήprepend· για σημασιολογία εισαγωγής στην κεφαλή ηunshiftείναι το ιδιωματικό εργαλείο, και οιList::Util::pairs/List::Util::zipσυνθέτονται μαζί της όταν αναδιαρθρώνετε σχήματα λίστας αντί να απλώς προσθέτετε σε μία