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— ίδιο συμβόλαιο ψευδωνυμοποίησης$_, αλλά επισκέπτεται πάντα κάθε στοιχείο και συλλέγει αποτελέσματα