Λίστες

any#

Επιστρέφει αληθές αν το BLOCK δίνει αληθές για τουλάχιστον ένα στοιχείο της LIST.

Η any εκτελεί το BLOCK μία φορά ανά στοιχείο της LIST, ψευδωνυμώντας το $_ στο τρέχον στοιχείο, και επιστρέφει αληθή τιμή τη στιγμή που το μπλοκ δίνει αληθές. Αν κανένα στοιχείο δεν κάνει το μπλοκ αληθές — συμπεριλαμβανομένης της περίπτωσης όπου η LIST είναι κενή — η any επιστρέφει ψευδές. Δεν εκτελεί ποτέ το μπλοκ περισσότερες φορές από όσες χρειάζεται: το πρώτο αληθές αποτέλεσμα αποφασίζει την απάντηση και τα υπόλοιπα στοιχεία δεν εξετάζονται.

Η any δεν είναι διαθέσιμη χωρίς προϋποθέσεις. Είναι μια βασική δεσμευμένη λέξη υπό feature-gate που εισήχθη στην Perl 5.42· ενεργοποιήστε την με:

use feature 'keyword_any';

Η μακροχρόνια List::Util::any, διαθέσιμη τουλάχιστον από την Perl 5.20, υλοποιεί την ίδια σημασιολογία ως υπορουτίνα. Οι δύο είναι εναλλάξιμες για καθημερινό κώδικα — επιλέξτε την βασική δεσμευμένη λέξη όταν θέλετε ελαφρώς μικρότερη επιβάρυνση κλήσης και ένα επιπλέον πλαίσιο στοίβας λιγότερο στα προφίλ, ή την List::Util::any όταν χρειάζεστε επίσης άλλες εξαγωγές της List::Util ή πρέπει να υποστηρίξετε Perls παλαιότερες της 5.42.

Σύνοψη#

use feature 'keyword_any';
any BLOCK LIST

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

Λογική τιμή: αληθή αν κάποια επανάληψη του BLOCK έδωσε αληθές, ψευδή διαφορετικά. Η ακριβής μορφή της τιμής αληθές/ψευδές είναι απροσδιόριστη — αντιμετωπίστε την επιστροφή ως λογική, μη βασίζεστε ότι θα λάβετε ειδικά 1 και "".

Μια κενή LIST επιστρέφει ψευδές. Αυτή είναι η μαθηματικά σωστή απάντηση (ο υπαρξιακός ποσοδείκτης πάνω σε κενό πεδίο είναι ψευδής) και ταιριάζει με την List::Util::any.

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

  • Το $_ ψευδωνυμίζεται σε κάθε στοιχείο της LIST διαδοχικά ενώ τρέχει το BLOCK. Η ψευδωνυμοποίηση είναι του ίδιου είδους που χρησιμοποιούν οι map και grep: η τροποποίηση του $_ μέσα στο μπλοκ τροποποιεί το ίδιο το στοιχείο της λίστας. Χρησιμοποιήστε μια ονομασμένη λεξιλογική μεταβλητή μέσω my $x = $_ στην πρώτη γραμμή του μπλοκ αν χρειάζεστε ασφαλές αντίγραφο.

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

Έλεγχος αν κάποια γραμμή σε μια λίστα ταιριάζει σε ένα μοτίβο:

use feature 'keyword_any';
my @lines = ("foo\n", "bar ERROR baz\n", "quux\n");
if (any { /ERROR/ } @lines) {
    warn "log contains an error line\n";
}

Έλεγχος αριθμητικού κατωφλίου:

use feature 'keyword_any';
my @nums = (1, 4, 7, 12, 3);
print "over limit\n" if any { $_ > 10 } @nums;   # over limit

Ανίχνευση σημαίας γραμμής εντολών, χωρίς εισαγωγή αρθρώματος:

use feature 'keyword_any';
if (any { $_ eq '--verbose' } @ARGV) {
    $verbose = 1;
}

Η any σε ζεύγος με την all ως έλεγχος ορθότητας — κάθε εγγραφή έχει id, και τουλάχιστον μία είναι σημαδεμένη ως ενεργή:

use feature qw(keyword_any keyword_all);
my @records = (
    { id => 1, active => 0 },
    { id => 2, active => 1 },
);
die "malformed" unless all { defined $_->{id} } @records;
die "none active" unless any { $_->{active} } @records;

Χρήση της έκδοσης από List::Util όταν δεν μπορείτε να εξαρτηθείτε από την Perl 5.42:

use List::Util qw(any);
print "found\n" if any { $_ eq 'needle' } @haystack;

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

  • Βραχυκυκλώνει στο πρώτο αληθές αποτέλεσμα. Οι παρενέργειες στο BLOCK τρέχουν μόνο για τα στοιχεία που εξετάστηκαν πριν (και συμπεριλαμβανομένου) το πρώτο αληθές στοιχείο. Μη χρησιμοποιείτε την any για να οδηγήσετε βρόχο που πρέπει να αγγίξει κάθε στοιχείο — χρησιμοποιήστε for ή map γι” αυτό.

  • Κενή LIST επιστρέφει ψευδές. Το any { anything } () είναι ψευδές χωρίς να εκτελεστεί ποτέ το μπλοκ.

  • Η ψευδωνυμοποίηση του $_ είναι πανομοιότυπη με τις map και grep. Η εγγραφή στο $_ μεταβάλλει το στοιχείο της πηγαίας λίστας. Το ιδίωμα any { my $x = $_; ... } καθιστά ρητό το αντίγραφο.

  • Η return μέσα στο BLOCK επιστρέφει από την περικλείουσα υπορουτίνα, όχι από την any. Για να τερματίσετε τη σάρωση νωρίς με συγκεκριμένη τιμή αλήθειας, αφήστε το μπλοκ να αξιολογηθεί σε εκείνη την τιμή — η any ήδη βραχυκυκλώνει.

  • Βασική δεσμευμένη λέξη έναντι List::Util::any. Και οι δύο υλοποιούν την ίδια σημασιολογία. Η βασική δεσμευμένη λέξη αποφεύγει ένα πλαίσιο κλήσης σε επίπεδο Perl ανά επίκληση της ίδιας της any, κάτι που εμφανίζεται σε σφιχτό προφιλάρισμα· το ίδιο το μπλοκ τρέχει ανά στοιχείο και στις δύο περιπτώσεις. Η ανάμιξη και των δύο στο ίδιο αρχείο είναι νόμιμη αλλά συγχέει· διαλέξτε μία ανά αρχείο.

  • Προειδοποίηση experimental::keyword_any. Επειδή η δεσμευμένη λέξη εξακολουθεί να σημειώνεται ως πειραματική, η ενεργοποίησή της εκπέμπει προειδοποίηση στην κατηγορία experimental::keyword_any κατά την πρώτη χρήση. Αποσιωπήστε την με no warnings 'experimental::keyword_any'; αφότου αποφασίσετε να εξαρτηθείτε από τη δεσμευμένη λέξη.

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

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

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

  • all — το αντίστοιχο του καθολικού ποσοδείκτη· αληθές αν και μόνο αν το BLOCK δίνει αληθές για κάθε στοιχείο

  • grep — συλλέγει κάθε στοιχείο που ταιριάζει· το scalar grep { ... } @list έχει την ίδια τιμή αλήθειας με το any { ... } @list αλλά εκτελεί το μπλοκ για κάθε στοιχείο

  • List::Util::any — μορφή υπορουτίνας πριν την 5.42 με πανομοιότυπη σημασιολογία

  • List::Util::first — επιστρέφει το πρώτο στοιχείο για το οποίο το μπλοκ είναι αληθές, αντί για λογική τιμή· χρησιμοποιήστε την όταν χρειάζεστε το ίδιο το στοιχείο

  • map — ίδιο συμβόλαιο ψευδωνυμοποίησης $_, αλλά επισκέπτεται πάντα κάθε στοιχείο και συλλέγει αποτελέσματα