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όταν χρειάζεστε ντετερμινιστική σειρά διάσχισης