any#
מחזיר אמת אם BLOCK מניב אמת עבור לפחות איבר אחד של LIST.
any מריץ את BLOCK פעם אחת לכל איבר של LIST, יוצר alias של $_ לאיבר הנוכחי, ומחזיר ערך אמת ברגע שהבלוק מניב אמת. אם אף איבר אינו גורם לבלוק להיות אמת — לרבות המקרה שבו LIST ריקה — any מחזיר שקר. הוא לעולם לא מריץ את הבלוק יותר פעמים מהנדרש: התוצאה האמיתית הראשונה מכריעה את התשובה והאיברים הנותרים אינם נבדקים.
any אינו זמין ללא תנאי. זוהי מילת מפתח של הליבה מוגנת־תכונה שהוצגה ב־Perl 5.42; יש להפעיל אותה באמצעות:
use feature 'keyword_any';
List::Util::any הוותיק, הזמין לפחות מאז Perl 5.20, מממש את אותה סמנטיקה כתת־שגרה. השניים ניתנים להחלפה בקוד יומיומי — יש לבחור במילת המפתח של הליבה כאשר רוצים תקורת קריאה מעט נמוכה יותר ופחות frame stack אחד בפרופילים, או ב־List::Util::any כאשר נדרשים גם ייצואים אחרים של List::Util או תמיכה ב־Perl ישן מ־5.42.
תקציר#
use feature 'keyword_any';
any BLOCK LIST
מה מוחזר#
ערך בוליאני: ערך אמת אם איטרציה כלשהי של BLOCK הניבה אמת, ערך שקר אחרת. הצורה המדויקת של ערך האמת/שקר אינה מוגדרת — יש להתייחס להחזרה כבוליאני, אין להסתמך על קבלת 1 ו־"" באופן ספציפי.
LIST ריקה מחזירה שקר. זוהי התשובה המתמטית הנכונה (כמת הקיום מעל תחום ריק הוא שקר) ותואמת ל־List::Util::any.
מצב גלובלי שהפונקציה נוגעת בו#
דוגמאות#
בדיקה אם שורה כלשהי ברשימה תואמת לתבנית:
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 } ()הוא שקר מבלי להריץ את הבלוק כלל.ה־aliasing של
$_זהה ל־mapו־grep. כתיבה ל־$_משנה את איבר רשימת המקור. הניבany { my $x = $_; ... }הופך את ההעתקה למפורשת.returnבתוךBLOCKחוזר מתת־השגרה העוטפת, לא מ־any. כדי לסיים את הסריקה מוקדם עם ערך אמת ספציפי, יש לאפשר לבלוק להעריך לאותו ערך —anyכבר עושה קצר־לוגי.מילת מפתח של הליבה לעומת
List::Util::any. שניהם מממשים את אותה סמנטיקה. מילת המפתח של הליבה חוסכת frame קריאה ברמת Perl לכל הפעלה שלanyעצמו, שמופיע בפרופילינג צפוף; הבלוק עצמו עדיין רץ לכל איבר בשני המקרים. ערבוב שניהם באותו קובץ הוא חוקי אך מבלבל; יש לבחור אחד לכל קובץ.אזהרת
experimental::keyword_any. מכיוון שמילת המפתח עדיין מסומנת ניסיונית, הפעלתה פולטת אזהרה בקטגוריהexperimental::keyword_anyבשימוש הראשון. יש להשתיק אותה באמצעותno warnings 'experimental::keyword_any';ברגע שהוחלט להסתמך על מילת המפתח.
הבדלים מן ה-upstream#
תואם מלא ל־Perl 5.42 upstream.
ראו גם#
all— המקבילה של כמת הכלל; אמת אם ורק אםBLOCKמניב אמת עבור כל איברgrep— אוסף כל איבר תואם;scalar grep { ... } @listבעל אותו ערך אמת כמוany { ... } @listאך מריץ את הבלוק עבור כל איברList::Util::any— צורת תת־שגרה מלפני 5.42 עם סמנטיקה זההList::Util::first— מחזיר את האיבר הראשון שעבורו הבלוק אמיתי, במקום ערך בוליאני; יש להשתמש בזה כאשר נדרש האיבר עצמוmap— אותו חוזה aliasing של$_, אך תמיד מבקר בכל איבר ואוסף תוצאות