delete#
Αφαιρεί τα κατονομασμένα ζεύγη κλειδιού-τιμής από έναν πίνακα κατακερματισμού, ή στοιχεία από έναν πίνακα, και επιστρέφει αυτό που αφαιρέθηκε.
Η delete φτάνει μέσα σε ένα σύνθετο και αφαιρεί τις καθορισμένες εγγραφές οριστικά - όχι απλώς θέτοντάς τες σε undef. Μετά την delete, η exists στο ίδιο κλειδί ή ευρετήριο επιστρέφει ψευδές, η keys δεν το παραθέτει πλέον, και η επανάληψη στον πίνακα κατακερματισμού με each το παρακάμπτει. Το όρισμα πρέπει να είναι στοιχείο ή τομή ενός πίνακα κατακερματισμού ή πίνακα· η τελική του λειτουργία επιλέγει τι θα αφαιρεθεί, και οτιδήποτε προηγείται αυτής της λειτουργίας (αποαναφορές, κλήσεις μεθόδων) είναι απλώς πλοήγηση.
Σύνοψη#
delete $hash{KEY} # scalar key
delete @hash{LIST} # hash slice: values of the listed keys
delete %hash{LIST} # key/value hash slice (5.20+)
delete $array[INDEX] # array element
delete @array[LIST] # array slice
Τι επιστρέφεται#
Σε περιβάλλον λίστας, η delete επιστρέφει την τιμή ή τις τιμές που αφαιρέθηκαν, με τη σειρά των ορισμάτων. Όρισμα τομής του οποίου το κλειδί ή ευρετήριο δεν υπήρχε αποδίδει undef στην αντίστοιχη θέση, οπότε το μήκος της επιστρεφόμενης λίστας ταιριάζει με το μήκος της λίστας κλειδιών/ευρετηρίων.
Σε βαθμωτό περιβάλλον, η delete επιστρέφει την τιμή του τελευταίου στοιχείου που αφαιρέθηκε, ή undef αν το κλειδί/ευρετήριο δεν ήταν παρόν.
Η μορφή τομής κλειδιών/τιμών της 5.20+ delete %hash{LIST} επιστρέφει λίστα από εναλλασσόμενα ζεύγη κλειδιού/τιμής - δύο στοιχεία για κάθε διαγραμμένη εγγραφή - γεγονός που την καθιστά τον ιδιωματικό τρόπο για να αποσπάσετε ένα κατονομασμένο σύνολο εγγραφών και να κρατήσετε και τις δύο πλευρές.
my %h = (foo => 11, bar => 22, baz => 33);
my $v = delete $h{foo}; # 11
my @v = delete @h{qw(bar quux)}; # (22, undef)
my %kv = delete %h{qw(baz quux)}; # (baz => 33, quux => undef)
Καθολική κατάσταση που επηρεάζει#
%ENV- ηdelete $ENV{VAR}καθαρίζει τη μεταβλητή περιβάλλοντος για την τρέχουσα διεργασία και τα μελλοντικά της παιδιά. Η επίδραση είναι πραγματική, όχι μόνο στον πίνακα κατακερματισμού από την πλευρά της Perl· οι κλήσεις συστήματος βλέπουν την αλλαγή.tied σύνθετα - η
deleteδρομολογείται στη μέθοδοDELETEτου πακέτου που κάνει tie. Η τιμή επιστροφής είναι ό,τι επιλέξει να επιστρέψει η υλοποίηση· κάποιοι tied πίνακες κατακερματισμού επιστρέφουν τη διαγραμμένη τιμή, κάποιοι όχι.$_- δεν επηρεάζεται. Ηdeleteδεν έχει προεπιλογή· ηEXPRείναι υποχρεωτική.
Παραδείγματα#
Αφαίρεση ενός κλειδιού, επιθεώρηση του τι υπήρχε:
my %cfg = (host => "db1", port => 5432, user => "alice");
my $old_host = delete $cfg{host};
# $old_host is "db1"; exists $cfg{host} is false
Απελευθέρωση μνήμης με αφαίρεση πολλών εγγραφών σε μία κλήση (τομή πίνακα κατακερματισμού):
delete @cache{@stale_keys};
Απόσπαση ενός συνόλου κατονομασμένων εγγραφών διατηρώντας τα ζεύγη (τομή κλειδιών/τιμών 5.20+):
my %h = (a => 1, b => 2, c => 3);
my %taken = delete %h{qw(a c)};
# %taken is (a => 1, c => 3); %h is (b => 2)
Διαγραφή μέσα από εμφωλευμένη δομή. Η αρχική πλοήγηση μπορεί να είναι αυθαίρετη - μόνο η τελική λειτουργία αποφασίζει τι αφαιρείται:
my $tree = { users => { alice => { roles => [qw(admin ro)] } } };
delete $tree->{users}{alice}{roles}[0];
# roles is now (undef, "ro")
delete $tree->{users}{alice};
# the whole user record is gone
Αποφύγετε αυτο-δημιουργία στην πλευρά ανάγνωσης ενώ συνεχίζετε να αφαιρείτε στην πλευρά εγγραφής. Η delete δεν αυτο-δημιουργεί ποτέ τους ενδιάμεσους πίνακες κατακερματισμού από τους οποίους περνά:
delete $h{outer}{inner}; # does not create $h{outer} if absent
Συγκρίνετε με την splice όταν θέλετε τα ευρετήρια να ανανεωθούν σε αρίθμηση. Η delete σε στοιχείο πίνακα αφήνει τρύπα· η splice κλείνει την τρύπα:
my @a = (10, 20, 30, 40);
delete $a[1];
# @a is (10, undef, 30, 40); $#a is still 3
my @b = (10, 20, 30, 40);
splice(@b, 1, 1);
# @b is (10, 30, 40); $#b is 2
Οριακές περιπτώσεις#
deleteέναντι ανάθεσηςundef: η$h{k} = undefαφήνει τοkστον πίνακα κατακερματισμού με απροσδιόριστη τιμή· ηexists $h{k}είναι ακόμη αληθής. Ηdelete $h{k}αφαιρεί το κλειδί εξ ολοκλήρου.Απόν κλειδί σε βαθμωτό περιβάλλον: η
delete $h{nope}επιστρέφειundef. Αυτό είναι αδιάκριτο από τη διαγραφή κλειδιού του οποίου η τιμή ήτανundef· χρησιμοποιήστε πρώτα τηνexistsαν η διάκριση έχει σημασία.each+deleteμέσα στον βρόχο: ασφαλές όταν διαγράφετε μόνο το τρέχον κλειδί (το κλειδί που μόλις επέστρεψε ηeach). Η διαγραφή άλλων κλειδιών κατά την επανάληψη μπορεί να παραλείψει εγγραφές ή να τις ξαναεπισκεφθεί - ο επαναλήπτης πίνακα κατακερματισμού της Perl δεν είναι σταθερός υπό δομική αλλαγή. Η ασφαλής αναδιατύπωση είναι να συλλέξετε πρώτα τα κλειδιά:for my $k (grep { $h{$_} < 0 } keys %h) { delete $h{$k}; }
Οι διαγραφές στο τέλος πίνακα συρρικνώνουν τον πίνακα: αν τα διαγραμμένα στοιχεία βρίσκονται στο πάνω άκρο, το
$#arrayπέφτει στο υψηλότερο ευρετήριο που ακόμη ελέγχεται ως αληθές υπόexists. Οι τρύπες στη μέση παραμένουν τρύπες.Η
deleteσε πίνακα αποθαρρύνεται: η έννοια του «απόντος ευρετηρίου» δεν είναι συνεκτική για πίνακες - τα ευρετήρια είναι θεσιακά, όχι κατονομασμένα. Αφήστε τη συρρίκνωση πίνακα στιςshift,popήsplice. ΗWARNINGστο upstream POD επαναλαμβάνεται: καταφύγετε στηdeleteσε πίνακα μόνο όταν ξέρετε ότι θέλετε τρύπα.delete local $h{k}: αφαιρεί την εγγραφή για το περικλείον μπλοκ και την επαναφέρει στην έξοδο από την εμβέλεια. Χρήσιμη για προσωρινή απόκρυψη κλειδιών διαμόρφωσης από κώδικα που καλείται μέσα στο μπλοκ χωρίς να χαθεί η αρχική τιμή:{ local $ENV{LANG}; # still present, but undef delete local $ENV{PATH}; # gone for this block only run_thing(); } # both restored to original values here
Tied πίνακας κατακερματισμού, tied πίνακας: η
deleteκαλεί τηνDELETE· η τιμή επιστροφής είναι ό,τι παρέχει η υλοποίηση tie. Ένας tied πίνακας κατακερματισμού DBM διαγράφει την εγγραφή στον δίσκο.Στόχος μόνο για ανάγνωση: η
deleteσε στοιχείο μόνο για ανάγνωση εκπέμπει σφάλμαModification of a read-only value attempted.Η έκφραση πρέπει να τελειώνει σε στοιχείο ή τομή: η
delete $h{k} + 1είναι σφάλμα μεταγλώττισης· ηdeleteέχει χαμηλότερη προτεραιότητα από την αριθμητική και αναμένει αναζήτηση σύνθετου τύπου lvalue, όχι υπολογισμένη τιμή.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
exists- ο αντίστοιχος ερώτησης· χρησιμοποιήστε την πριν τηνdeleteόταν χρειάζεται να ξεχωρίσετε «δεν υπήρξε ποτέ εκεί» από «ήταν εκεί με τιμήundef»each- επαναλήπτης πίνακα κατακερματισμού· ασφαλής συνδυασμός με τηdeleteμόνο όταν διαγράφετε το τρέχον κλειδίkeys- στιγμιότυπο των κλειδιών του πίνακα κατακερματισμού· ο συνήθης τρόπος δόμησης λίστας διαγραφής που δεν θα αλληλεπιδράσει με την κατάσταση του επαναλήπτηvalues- συνοδευτική τηςkeysόταν θέλετε το σύνολο των διαγραμμένων τιμών χωρίς τα κλειδιάsplice- το σωστό εργαλείο όταν θέλετε να αφαιρέσετε στοιχεία πίνακα και να ξαναριθμήσετε τα εναπομείναντα ευρετήριαundef- εκκαθαρίζει ολόκληρο σύνθετο (undef %h,undef @a) ή ένα μεμονωμένο βαθμωτό· ο καθιερωμένος τρόπος για να αδειάσετε πίνακα κατακερματισμού ή πίνακα συνολικά αντί να διαγράφετε κάθε κλειδί