splice#
Αφαιρεί και/ή αντικαθιστά μια τομή ενός πίνακα επιτόπου, και επιστρέφει τα στοιχεία που αφαιρέθηκαν.
Η splice είναι ο χειρουργός γενικής χρήσης για πίνακες. Κάθε άλλος τροποποιητής πίνακα - οι push, pop, shift, unshift, ανάθεση μεμονωμένου στοιχείου - μπορεί να γραφτεί ως κλήση splice. Επιλέξτε τη θέση με το OFFSET, επιλέξτε πόσα στοιχεία να αποκόψετε με το LENGTH, και προαιρετικά παρέχετε μια LIST αντικαταστατών. Ο πίνακας μεγαλώνει ή συρρικνώνεται για να χωρέσει, και λαμβάνετε πίσω ό,τι αποκόπηκε.
Σύνοψη#
splice @array; # remove everything
splice @array, $offset; # remove from $offset to the end
splice @array, $offset, $length; # remove $length elements
splice @array, $offset, $length, @list; # remove and replace with @list
Τι επιστρέφεται#
Περιβάλλον λίστας: η λίστα των στοιχείων που αφαιρέθηκαν, στην αρχική τους σειρά. Κενή λίστα αν δεν αφαιρέθηκε τίποτα.
Βαθμωτό περιβάλλον: το τελευταίο στοιχείο που αφαιρέθηκε, ή
undefαν δεν αφαιρέθηκε τίποτα. Αυτό σπάνια είναι αυτό που θέλετε - καταφύγετε σε περιβάλλον λίστας εκτός αν χρειάζεστε ειδικά μόνο την ουρά.Κενό περιβάλλον: τίποτα· χρησιμοποιήστε αυτή τη μορφή όταν σας ενδιαφέρει μόνο η επιτόπια τροποποίηση.
Παραδείγματα#
Βασική αφαίρεση - αποκοπή δύο στοιχείων ξεκινώντας από τη θέση 1:
my @a = ('a', 'b', 'c', 'd', 'e');
my @gone = splice @a, 1, 2;
# @a == ('a', 'd', 'e')
# @gone == ('b', 'c')
Εισαγωγή χωρίς αφαίρεση - το LENGTH είναι 0, οπότε δεν βγαίνει τίποτα και η LIST εμβολιάζεται στο OFFSET:
my @a = (1, 2, 5, 6);
splice @a, 2, 0, 3, 4;
# @a == (1, 2, 3, 4, 5, 6)
Αντικατάσταση τμήματος - το LENGTH και το μέγεθος αντικατάστασης δεν χρειάζεται να ταιριάζουν. Εδώ τρία στοιχεία φεύγουν, ένα φτάνει:
my @a = ('x', 'y', 'z', 'w', 'v');
my @gone = splice @a, 1, 3, 'Y';
# @a == ('x', 'Y', 'v')
# @gone == ('y', 'z', 'w')
Αφαίρεση της ουράς - παραλείψτε εντελώς το LENGTH για αποκοπή από το OFFSET μέχρι το τέλος:
my @a = (1, 2, 3, 4, 5);
my @tail = splice @a, 3;
# @a == (1, 2, 3)
# @tail == (4, 5)
Αρνητικό OFFSET μετράει από το τέλος. Pop του τελευταίου στοιχείου:
my @a = ('a', 'b', 'c');
my $last = splice @a, -1;
# @a == ('a', 'b')
# $last == 'c'
Κλασικό ιδίωμα - κατανάλωση ενός πίνακα $n στοιχεία τη φορά:
while (my @chunk = splice @queue, 0, $n) {
process(@chunk);
}
Όλες οι συνηθισμένες πρωτογενείς λειτουργίες πίνακα γραμμένες ως splice (υποθέτοντας $#a >= $i):
push @a, $x, $y; # splice @a, scalar(@a), 0, $x, $y
pop @a; # splice @a, -1
shift @a; # splice @a, 0, 1
unshift @a, $x, $y; # splice @a, 0, 0, $x, $y
$a[$i] = $y; # splice @a, $i, 1, $y
Οριακές περιπτώσεις#
Αρνητικό
OFFSETμετράει από το τέλος: το-1είναι το τελευταίο στοιχείο, το-2το προηγούμενο, και ούτω καθεξής. Αν το μέτρο υπερβαίνει το μήκος του πίνακα, η Perl εκπέμπει προειδοποίηση και περικόπτει στο0.Αρνητικό
LENGTHαφήνει τόσα στοιχεία στο τέλος του πίνακα ανέπαφα. Ηsplice @a, 2, -1αφαιρεί από τη θέση2μέχρι αλλά όχι συμπεριλαμβανομένου του τελευταίου στοιχείου.OFFSETπέρα από το τέλος: με ρητόLENGTH, η Perl εκπέμπει προειδοποίηση και εμβολιάζει στο τέλος του πίνακα (ισοδύναμο μεsplice @a, scalar(@a), 0, LIST). ΧωρίςLENGTH, δεν αφαιρείται τίποτα.LENGTHπέρα από το τέλος: περικόπτεται σιωπηλά. Ηsplice @a, 1, 999απλώς αφαιρεί τα πάντα από τη θέση1και μετά.Παραλείπονται και το
OFFSETκαι τοLENGTH: αφαιρείται κάθε στοιχείο. Ο πίνακας μένει κενός.Το μέγεθος της λίστας αντικατάστασης διαφέρει από το
LENGTH: ο πίνακας μεγαλώνει ή συρρικνώνεται για να ταιριάξει. Δεν απαιτείται τοscalar(@list)να ισούται με τοLENGTH- αυτή η ασυμμετρία είναι όλο το νόημα τηςsplice.Αναφορά πίνακα: κάντε dereference inline. Οι
splice @$ref, 0, 1καιsplice @{ $obj->{items} }, -2δουλεύουν και οι δύο.Η
spliceσε τομή δεν υποστηρίζεται: ηsplice @a[1..3], 0, 1είναι συντακτικό σφάλμα. Ηspliceαπαιτεί κατονομασμένο πίνακα ή αποαναφερόμενο πίνακα, όχι έκφραση λίστας. Για να λειτουργήσετε σε εύρος, περάστε τα όρια ωςOFFSETκαιLENGTH.Το κενό περιβάλλον είναι εντάξει. Αν δεν χρειάζεται η τιμή επιστροφής, καλέστε την
spliceως εντολή - σε αυτή την περίπτωση δεν γίνεται καμία εκχώρηση της λίστας αφαιρεμένων στοιχείων.Βαθμωτές εκφράσεις ως πρώτο όρισμα: δεν επιτρέπονται. Ένα πειραματικό χαρακτηριστικό το επέτρεπε από την 5.14 έως την 5.22 και αφαιρέθηκε στην 5.24. Το πρώτο όρισμα πρέπει να είναι πίνακας (ή αποαναφερόμενο arrayref).
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
push- προσάρτηση στο τέλος· ισοδύναμο μεsplice @a, scalar(@a), 0, LISTpop- αφαίρεση του τελευταίου στοιχείου· ισοδύναμο μεsplice @a, -1shift- αφαίρεση του πρώτου στοιχείου· ισοδύναμο μεsplice @a, 0, 1unshift- πρόθεμα στην αρχή· ισοδύναμο μεsplice @a, 0, 0, LISTdelete- επιφανειακά παρόμοιο αλλά σημασιολογικά διαφορετικό. Ηdelete $a[$i]αφήνει τρύπα (η θέση γίνεταιundef) και δεν αναριθμεί τις μετέπειτα θέσεις· το μήκος του πίνακα δεν αλλάζει εκτός αν η διαγραμμένη θέση ήταν η τελευταία. Ηsplice @a, $i, 1αφαιρεί φυσικά τη θέση και μετατοπίζει κάθε μετέπειτα στοιχείο μία θέση πίσω. Χρησιμοποιήστεdeleteγια αραιούς πίνακες όπου η ταυτότητα της θέσης έχει σημασία· χρησιμοποιήστεspliceόταν θέλετε ο πίνακας να κλείσει.grep- φιλτράρει έναν πίνακα σε έναν νέο μέσω κατηγορήματος· καταφύγετε σε αυτό αντί γιαspliceόταν θέλετε «κράτησε μόνο όσα ταιριάζουν» αντί για «κόψε ένα συνεχόμενο εύρος»