Λίστες

any#

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

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

any is not unconditionally available. It is a feature-gated core keyword introduced in Perl 5.44; enable it with:

use feature 'keyword_any';

The long-standing List::Util::any, available since at least Perl 5.20, implements the same semantics as a subroutine. The two are interchangeable for everyday code - pick the core keyword when you want the slightly lower call overhead and an extra stack frame fewer in profiles, or List::Util::any when you also need other List::Util exports or have to support Perls older than 5.44.

Σύνοψη#

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;

Using the List::Util version when you cannot depend on Perl 5.44:

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#

Fully compatible with upstream Perl 5.44.

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

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

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

  • List::Util::any - pre-5.44 subroutine form with identical semantics

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

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