שונות

scalar#

מאלץ הערכת EXPR בהקשר סקלר ומחזיר את ערכו.

scalar אינו ממש אופרטור בזכות עצמו - הוא סמן המרת־הקשר שהמפענח מזהה לפני ביטוי אונארי. Perl מעריך את הביטוי בהקשר סקלר ומניב את כל מה שאותו ביטוי מפיק שם. הפונקציה קיימת משום שרוב המיקומים בתוכנית Perl כבר כופים הקשר (רשימה או סקלר) על האופרנדים שלהם, ולעיתים אתם צריכים לעקוף הקשר רשימה עם הקשר סקלר במפורש.

תקציר#

scalar EXPR
scalar @array
scalar %hash
scalar localtime

מה מקבלים בחזרה#

ערך EXPR כפי שמוערך בהקשר סקלר. הצורה המדויקת תלויה לגמרי במה ש־EXPR הוא:

  • עבור מערך, ספירת האלמנטים.

  • עבור האש, ערך אמת (לא ריק) או 0 (ריק); ב־Perls ישנים זו הייתה מחרוזת ניצול־דליים, אך מ־5.26 ואילך זו ספירת המפתחות.

  • עבור פונקציה רגישה להקשר רשימה, כל מה שהפונקציה הזו מחזירה כשקוראים לה בהקשר סקלר (לדוגמה, localtime מחזיר את מחרוזת ה־ctime שלו במקום הרשימה בעלת תשעת האלמנטים).

  • עבור ביטוי שכבר סקלרי, אותו ערך - scalar הוא no-op שם.

מצב גלובלי שהוא נוגע בו#

אין. scalar הוא המרת הקשר טהורה; הוא אינו קורא או כותב משתנים מיוחדים משלו. הביטוי שאתם מעבירים יכול, כמובן, לגעת בכל הגלובלים שהוא בדרך כלל נוגע בהם.

דוגמאות#

ספירת האלמנטים של מערך בתוך מיקום של הקשר רשימה:

my @items = (10, 20, 30);
my @counts = (scalar @items);       # (3)
print scalar @items, "\n";          # 3

ללא scalar, @items היה מתרחב לאלמנטים שלו ו־@counts היה (10, 20, 30).

הדפסת התאריך הקריא־לאדם מ־localtime. בהקשר רשימה localtime מחזיר תשעה שדות; בהקשר סקלר הוא מחזיר את מחרוזת ה־ctime המוכרת:

print localtime, "\n";              # nine numbers run together
print scalar localtime, "\n";       # "Thu Apr 23 14:02:11 2026"

אותה מלכודת מופיעה בכל מקום שבו built-in רגיש להקשר רשימה:

my @parts = localtime;              # (sec, min, hour, mday, ...)
my $now   = scalar localtime;       # ctime string

בדיקה אם האש אינו ריק מבלי להקצות את רשימת המפתחות שלו:

if (scalar %config) {
    # %config has at least one key
}

if (%config) כבר כופה הקשר סקלר (בוליאני), ולכן ה־scalar כאן מיותר אך מפורש; כותבים מצרפים אותו לעיתים כדי להפוך את הכוונה לגלויה לקוראים.

בניית רשימת ספירות מכמה מערכים בביטוי אחד:

my @counts = (scalar @a, scalar @b, scalar @c);

המרה של קריאת פונקציה שאחרת הייתה משוטחת לרשימה מקיפה:

my @row = ($id, scalar get_tags($id), $mtime);

ללא scalar, get_tags היה רץ בהקשר רשימה והרשימה המוחזרת שלו הייתה משוטחת ל־@row יחד עם $id ו־$mtime.

מקרי קצה#

  • אין מקבילה להקשר רשימה. אין אופרטור list EXPR; הקשר רשימה הוא ברירת המחדל כמעט בכל מיקום שבו ייתכן שתרצו לכפות אותו. אם אתם באמת זקוקים להמיר ביטוי סקלר להקשר רשימה, הניב הוא @{[ EXPR ]}, אם כי ברוב המקרים (EXPR) פשוט מספיק.

  • מלכודת רשימה בסוגריים. scalar הוא אופרטור אונארי. העברה אליו של ביטוי פסיק בסוגריים אינה מעריכה את הביטוי הזה כרשימה; היא מעריכה אותו כאופרטור פסיק סקלרי, אשר מריץ כל תת־ביטוי בהקשר void פרט לאחרון ומחזיר את האחרון בהקשר סקלר:

    print uc(scalar(foo(), $bar)), $baz;
    # equivalent to:
    foo();                              # void context
    print(uc($bar), $baz);              # $bar in scalar context
    

    אם רציתם שערכי ההחזרה של foo() ייכללו, scalar (list) הוא הכלי הלא־נכון.

  • האש בהקשר סקלר. מ־Perl 5.26 ואילך, scalar %h מחזיר את מספר המפתחות, אותו דבר כמו scalar keys %h. ב־Perls ישנים הוא החזיר מחרוזת כמו "4/8" המדווחת על ניצול דליים; pperl מכוון ל־5.42 ולכן תמיד מחזיר את ספירת המפתחות.

  • Prototypes של תת־שגרות. תת־שגרה שהוצהרה עם prototype סקלרי (($)) כבר כופה הקשר סקלר על הארגומנט שלה, ולכן scalar מיותר לפני הקריאה. prototype של (@) או (\@) לא, ולכן scalar עדיין משנה:

    sub count ($) { $_[0] }
    count @items;                       # @items in scalar context: 3
    
  • מיותר על ביטויים שכבר סקלריים. scalar $x, scalar 42, scalar "text" הם no-ops. Perl אינו מזהיר עליהם; הם משמשים לעיתים להדגשה אך אינם מוסיפים דבר.

  • אינו קריאת פונקציה. משום ש־scalar הוא סמן הקשר ברמת המפענח, לא ניתן לקחת \&scalar, לא ניתן לעקוף אותו עם sub scalar { ... }, ולא ניתן להעביר אותו כהפניית קוד.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • wantarray - בדקו את ההקשר שבו נקראתם, במקום לכפות אחד על תת־ביטוי

  • defined - באופן דומה אופרטור אונארי המוחל על ביטוי; שימושי לצד scalar בעת בדיקת תוצאות פונקציה

  • localtime - דוגמה קנונית של built-in שצורת ההחזרה שלו תלויה בהקשר

  • reverse - גם רגיש להקשר; scalar reverse $s הופך תווים, reverse @a הופך רשימה

  • keys - scalar keys %h היא הצורה הארוכה של scalar %h עם אותה תוצאה ב־5.26+