רשימות

any#

מחזיר אמת אם BLOCK מניב אמת עבור לפחות איבר אחד של LIST.

any מריץ את BLOCK פעם אחת לכל איבר של LIST, יוצר alias של $_ לאיבר הנוכחי, ומחזיר ערך אמת ברגע שהבלוק מניב אמת. אם אף איבר אינו גורם לבלוק להיות אמת - לרבות המקרה שבו 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.

מצב גלובלי שהפונקציה נוגעת בו#

  • $_ מקבל alias לכל איבר של LIST בתורו בזמן ש־BLOCK רץ. ה־aliasing הוא מאותו סוג ש־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 } () הוא שקר מבלי להריץ את הבלוק כלל.

  • ה־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#

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 - אותו חוזה aliasing של $_, אך תמיד מבקר בכל איבר ואוסף תוצאות