Hashes

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) ή ένα μεμονωμένο βαθμωτό· ο καθιερωμένος τρόπος για να αδειάσετε πίνακα κατακερματισμού ή πίνακα συνολικά αντί να διαγράφετε κάθε κλειδί