all#
בדיקה אם BLOCK מחזיר אמת עבור כל איבר של LIST.
all סורק את LIST משמאל לימין, יוצר alias של $_ לכל איבר בתורו ומעריך את BLOCK עם אותו איבר. הוא מחזיר ערך אמת אם כל הערכה מניבה אמת, וערך שקר ברגע שהערכה כלשהי מניבה שקר. ברגע שאיבר אחד גורם לבלוק להיות שקרי, all עוצר ומחזיר - הוא אינו מעריך את הבלוק עבור האיברים הנותרים.
זוהי מילת המפתח all ברמת השפה, מופעלת על ידי תכונת keyword_all. היא מובחנת מ־List::Util::all - ראו מקרי קצה להלן.
תקציר#
use feature 'keyword_all';
no warnings 'experimental::keyword_all';
all { /\w+/ } @words;
all { defined $_ } @list; # canonical "all defined" check
all { $_ > 0 } @numbers;
מה מוחזר#
ערך בוליאני. אמת אם כל איבר עובר, שקר אחרת. ערכי האמת/שקר המדויקים אינם מוגדרים - יש להתייחס לתוצאה כאל תנאי, לא כאל נתון להעברה.
רשימה ריקה מחזירה אמת. זוהי אמת ריקה: הטענה ”כל איבר מקיים את BLOCK“ אמיתית טריוויאלית כשאין איברים לבדוק. זהו מקור ההפתעה הנפוץ ביותר עם all:
all { $_ > 0 } (); # TRUE - no elements, nothing to fail
יש להגן בבדיקת גודל מפורשת כאשר רשימה ריקה צריכה להיחשב ככישלון:
if (@numbers && all { $_ > 0 } @numbers) { ... }
מצב גלובלי שהפונקציה נוגעת בו#
דוגמאות#
בדיקה שכל ערך ברשימה מוגדר - השימוש הקנוני:
my @row = get_record();
die "missing field" unless all { defined $_ } @row;
בדיקה שכל מספר חיובי:
my @prices = (1.99, 4.50, 0.99);
say "ok" if all { $_ > 0 } @prices; # ok
תיקוף רשומה שבה כל שדה חייב להתאים לפרדיקט שלו. יש לשלב מספר בדיקות בתוך הבלוק במקום לשרשר קריאות all:
my @fields = ($name, $age, $email);
my $ok = all {
defined $_ && length $_ > 0
} @fields;
שילוב all עם any לבדיקה בלעדית - לפחות התאמה אחת, אך לא כל האיברים זהים:
if (any { $_ eq 'admin' } @roles
&& !all { $_ eq 'admin' } @roles) {
say "mixed roles, including admin";
}
התנהגות קצר־לוגי: הבלוק רץ רק עד לכישלון הראשון. שימושי עבור פרדיקטים עם תופעות לוואי או עלות:
all { expensive_check($_) } @candidates; # stops at first failure
מקרי קצה#
רשימה ריקה מחזירה אמת. אמת ריקה. יש להגן עם
@list && all { ... } @listכאשר ריקנות אמורה להיכשל.קצר־לוגי על שקר ראשון. הבלוק אינו נקרא עבור איבר כלשהו לאחר הכישלון הראשון. אין להסתמך על כך שתופעות לוואי בבלוק ירוצו עבור כל איבר - יש להשתמש בלולאת
forאם נדרש כך.$_הוא alias, לא העתק. שינוי$_בתוך הבלוק משנה את איבר הרשימה:my @xs = (1, 2, 3); all { $_++; $_ > 0 } @xs; # @xs is now (2, 3, 4)
Experimental under 5.44. The feature emits a compile-time warning in the
experimental::keyword_allcategory unless that category is silenced:no warnings 'experimental::keyword_all';
אינו זהה ל־
List::Util::all. המובנה הוא מילת מפתח של השפה המופעלת על ידי תכונתkeyword_allומפענח אתBLOCKכבלוק אמיתי (ללאsubמוביל, ללא פסיק נגרר).List::Util::allהיא תת־שגרה רגילה המיובאת ממודול ומקבלת ארגומנט code reference / block prototype. למרבית המטרות המעשיות הן מתנהגות זהה ברשימות שאינן ריקות, אך:צורת מילת המפתח היא מבנה ברמת ה־parser וניתנת לאופטימיזציה אגרסיבית יותר.
השניים אינם חולקים מימוש ולא קטגוריית אזהרה.
Code that needs to run on pre-5.44 perls should use
List::Util::all.
צורת
grepשווה־ערך.all { COND } @xsשווה־ערך סמנטית ל־@xs == grep { COND } @xs- אךgrepתמיד מעריך את הבלוק עבור כל איבר, ולכן חסרה לו התנהגות הקצר־לוגי שלall.
הבדלים מן ה-upstream#
Fully compatible with upstream Perl 5.44.
ראו גם#
any- אמת אם הבלוק מחזיר אמת עבור לפחות איבר אחד; האופרטור הראי ל־allgrep- מעריך את הבלוק עבור כל איבר ומחזיר התאמות;scalar @list == grep { … } @listהואallללא הקצר־לוגיdefined- הפרדיקט בתוך הבדיקה הקנוניתall { defined $_ } @listList::Util::all- module-level equivalent available on perls older than 5.44; also providesnoneandnotallwhich have no language-level counterpartList::Util::any- מקבילה ברמת המודול למילת המפתחany, לצדnoneו־notallלקטביות ההפוכות