Πίνακες · Hashes

values#

Απαριθμεί κάθε τιμή ενός hash (ή κάθε στοιχείο ενός πίνακα).

Η values είναι ο συνεργάτης από την πλευρά των τιμών για την keys. Δοθέντος ενός hash, επιστρέφει όλες τις τιμές· δοθέντος ενός πίνακα, επιστρέφει όλα τα στοιχεία. Τα στοιχεία επιστρέφονται ως ψευδώνυμα μέσα στον υποκείμενο περιέκτη, οπότε η ανάθεση σε αυτά από βρόχο τροποποιεί τον περιέκτη επιτόπου. Ως παρενέργεια, η κλήση της values επαναφέρει τον επαναλήπτη που μοιράζονται οι each, keys και values για αυτό το hash ή τον πίνακα.

Σύνοψη#

my @v = values %hash;
my @v = values @array;
my $n = scalar values %hash;    # number of values
for (values %hash) { $_ *= 2 }  # mutate in place via aliasing

Τι επιστρέφεται#

Σε περιβάλλον λίστας: η πλήρης λίστα τιμών από hash, ή η πλήρης λίστα στοιχείων από πίνακα. Οι εγγραφές πίνακα επιστρέφονται σε σειρά θέσεων (μικρότερη θέση πρώτη). Οι εγγραφές hash επιστρέφονται σε ορισμένη από την υλοποίηση, τυχαία ανά hash σειρά - δείτε Οριακές περιπτώσεις.

Σε βαθμωτό περιβάλλον: το πλήθος εγγραφών, πανομοιότυπο με το scalar keys %h για hashes και scalar @a για πίνακες. Η values σε κενό περιβάλλον δεν κάνει τίποτα παρατηρήσιμο εκτός από το να επαναφέρει τον επαναλήπτη - αυτός είναι ο ιδιωματικός τρόπος βίαιης επαναφοράς επαναλήπτη στη μέση διάσχισης:

values %h;                       # void context: iterator reset only

Η επιστρεφόμενη λίστα δεν είναι αντίγραφο. Κάθε στοιχείο είναι ψευδώνυμο προς τη ζωντανή τιμή στον περιέκτη. Η ψευδωνυμοποίηση είναι τεκμηριωμένη συμπεριφορά και αποτελεί τη βάση για το ιδίωμα επιτόπιας τροποποίησης στην ενότητα Παραδείγματα.

Καθολική κατάσταση που επηρεάζει#

Η values επαναφέρει την κατάσταση επαναλήπτη ανά περιέκτη που διαβάζει και προωθεί η each. Οποιοσδήποτε βρόχος while (my ($k, $v) = each %h) { ... } σε εξέλιξη στο ίδιο hash θα ξεκινήσει από την αρχή την επόμενη φορά που θα κληθεί η each. Η keys έχει το ίδιο αποτέλεσμα. Ο επαναλήπτης είναι ιδιότητα του περιέκτη, όχι κανενός συγκεκριμένου σημείου κλήσης - οπότε ένας καλών σε μία sub μπορεί να ενοχλήσει βρόχο each που τρέχει σε άλλη sub αν λειτουργούν στο ίδιο hash.

Παραδείγματα#

Επανάληψη σε hash σε ταξινομημένη ως προς το κλειδί σειρά, κάτι που η values από μόνη της δεν σας δίνει:

my %score = (alice => 90, bob => 75, carol => 82);
for my $k (sort keys %score) {
    print "$k: $score{$k}\n";
}

Άθροισμα κάθε τιμής ενός hash:

use List::Util qw(sum0);
my %count = (apples => 3, pears => 5, plums => 2);
my $total = sum0 values %count;     # 10

Τροποποίηση κάθε τιμής επιτόπου μέσω του ψευδωνύμου:

my %prices = (bread => 3.00, milk => 2.50, eggs => 4.20);
$_ *= 1.10 for values %prices;      # apply 10% price rise
# %prices is now (bread => 3.30, milk => 2.75, eggs => 4.62)

Το ίδιο ιδίωμα λειτουργεί σε πίνακα, αν και για πίνακες ένας σκέτος βρόχος @array είναι πιο συμβατικός:

my @nums = (1, 2, 3, 4);
$_ **= 2 for values @nums;          # @nums is now (1, 4, 9, 16)

Βίαιη επαναφορά επαναλήπτη each σε εξέλιξη χωρίς κατανάλωση της εξόδου του:

while (my ($k, $v) = each %h) {
    last if $v > $threshold;
}
values %h;                          # void context: drop iterator state
# next each %h starts from the beginning

Καταμέτρηση εγγραφών χωρίς δημιουργία της λίστας - το βαθμωτό περιβάλλον ποτέ δεν υλοποιεί τις τιμές:

if (scalar values %cache > 10_000) {
    prune(\%cache);
}

Οριακές περιπτώσεις#

  • Η ψευδωνυμοποίηση είναι το χαρακτηριστικό και η παγίδα. Το for (values %h) σας δίνει ψευδώνυμα, όχι αντίγραφα. Μια αθώα φαινομενικά s/// μέσα σε τέτοιο βρόχο ξαναγράφει το hash. Αν θέλετε αντίγραφα, αναθέστε πρώτα: my @v = values %h; for (@v) { ... }.

  • Η σειρά hash είναι τυχαιοποιημένη. Η Perl 5.18+ τυχαιοποιεί τη σειρά διάσχισης ανά hash. Δύο hashes χτισμένα από τα ίδια κλειδιά μπορούν να επιστρέφουν τιμές σε διαφορετική σειρά. Μη βασίζεστε ποτέ στη σειρά για οτιδήποτε φεύγει από τη διεργασία - σειριοποιήστε μέσω sort keys αν χρειάζεστε σταθερότητα.

  • Η σειρά είναι σταθερή μόνο όσο το hash παραμένει αμετάβλητο. Εισαγωγές και διαγραφές ενδέχεται να μεταθέσουν τη σειρά. Η μόνη τεκμηριωμένη εξαίρεση είναι η διαγραφή του κλειδιού που επιστράφηκε πιο πρόσφατα από την each ή keys, η οποία αφήνει την υπόλοιπη σειρά ανέπαφη.

  • Οι keys, values, each συμφωνούν. Για ένα hash που δεν έχει τροποποιηθεί μεταξύ κλήσεων, οι keys %h και values %h παράγουν αντίστοιχες λίστες στην ίδια σειρά - οι (keys %h)[$i] και (values %h)[$i] κατονομάζουν την ίδια εγγραφή.

  • Η μορφή για πίνακα συμπεριφέρεται όπως το @array συν επαναφορά. Η values @a σε περιβάλλον λίστας είναι ισοδύναμη με το @a, με την παρενέργεια της επαναφοράς του επαναλήπτη του πίνακα. Για μόνη την επαναφορά επαναλήπτη, η keys @a σε κενό περιβάλλον είναι η συμβατική επιλογή.

  • Κενό hash ή πίνακας επιστρέφει την κενή λίστα σε περιβάλλον λίστας και 0 σε βαθμωτό περιβάλλον. Καμία προειδοποίηση, κανένα σφάλμα.

  • Tied hashes. Η συμπεριφορά ανατίθεται στις μεθόδους FIRSTKEY / NEXTKEY / FETCH της κλάσης tie. Η σειρά, η ψευδωνυμοποίηση και η σημασιολογία επαναφοράς επαναλήπτη ακολουθούν ό,τι παρέχει η υλοποίηση tie - οι εγγυήσεις του καθαρού hash παραπάνω δεν μεταφέρονται αυτόματα.

  • Αφαιρεμένο πείραμα: βαθμωτό όρισμα. Η Perl 5.14–5.22 δεχόταν πειραματικά το values $ref· αυτό το πείραμα αφαιρέθηκε στην 5.24. Κάντε dereference ρητά: values %$ref, values @$ref.

  • Η υποστήριξη για πίνακες απαιτεί 5.12+. Η εκτέλεση values @a σε παλαιότερη Perl εγείρει συντακτικό σφάλμα. Χρησιμοποιήστε use v5.12; στην κορυφή αρχείου που βασίζεται στη μορφή για πίνακες για να καταστήσετε ρητή την απαίτηση.

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

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

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

  • keys - ο συνεργάτης από την πλευρά των κλειδιών· ίδιοι κανόνες σειράς, ίδιος επαναλήπτης, βαθμωτό περιβάλλον επιστρέφει το πλήθος

  • each - βηματική επανάληψη που επιστρέφει ζεύγη ($key, $value)· μοιράζεται τον επαναλήπτη που η values επαναφέρει

  • exists - έλεγχος αν ένα κλειδί είναι παρόν χωρίς πυροδότηση αυτο-δημιουργίας

  • delete - αφαιρεί ένα ζεύγος κλειδιού/τιμής· η διαγραφή του τελευταία επιστραφέντος κλειδιού της each ή keys αφήνει την υπόλοιπη σειρά διάσχισης ανέπαφη

  • map - μετασχηματισμός τιμών σε παράγωγη λίστα χωρίς τροποποίηση του hash (η εναλλακτική χωρίς ψευδωνυμοποίηση έναντι του for (values %h))

  • sort - συνδυάστε με keys όταν χρειάζεστε ντετερμινιστική σειρά διάσχισης