אופרטורים אריתמטיים#
מערך הפעולות של מחשבון ארבע־הפעולות המספרי, בתוספת מודולו והעלאה בחזקה, בתוספת אופרטורי הסימן האונריים.
אופרטור | פעולה | אריות | אסוציאטיביות |
|---|---|---|---|
| העלאה בחזקה | בינארי | ימין |
| כפל | בינארי | שמאל |
| חילוק | בינארי | שמאל |
| מודולו | בינארי | שמאל |
| חיבור | בינארי | שמאל |
| חיסור | בינארי | שמאל |
| פלוס אונרי | אונרי | ימין |
| שלילה אונרית | אונרי | ימין |
All arithmetic operators evaluate their operands in numeric context
כל האופרטורים האריתמטיים מעריכים את האופרנדים שלהם בהקשר מספרי - מחרוזות נכפות על־פי הכלל ״הקידומת המספרית המובילה מנצחת, השאר מתעלמים ממנו (עם אזהרת
Argument "..." isn't numericתחתuse warnings)״.
my $x = 5 + 3; # 8
my $y = 10 / 3; # 3.3333333333333…
my $z = 2 ** 10; # 1024
my $rem = 17 % 5; # 2
my $neg = -$x; # -8
קדימות ואסוציאטיביות#
** נקשר בחוזקה הרבה ביותר והוא אסוציאטיבי לימין. *, /, % מהווים קבוצה אחת; +, - מהווים אחרת. + ו־- אונריים נקשרים בין ** ל־* (קדימות גבוהה).
2 ** 3 ** 2 # 2 ** 9 = 512 (right-assoc: top-down)
-2 ** 2 # -(2 ** 2) = -4 (** binds tighter than unary -)
(-2) ** 2 # 4 (parens override)
6 / 2 / 3 # (6 / 2) / 3 = 1 (left-assoc on /)
המקרה -2 ** 2 נושך את כולם בדיוק פעם אחת. הקיפו את הסימן בסוגריים כשהבסיס עשוי להיות שלילי.
חילוק#
/ תמיד מחזיר תוצאה בנקודה צפה, אפילו עבור אופרנדים שלמים שמתחלקים בדיוק:
10 / 5 # 2 -- numerically equal, stored as int or float
# depending on the runtime; treat as numeric
10 / 4 # 2.5
10 / 3 # 3.3333333333333335
לחילוק שלם, השתמשו ב־int:
int(10 / 4) # 2
int(-7 / 2) # -3 (truncation toward zero, not floor)
חילוק באפס הוא שגיאה קטלנית (לא אזהרה, ולא פעולה המייצרת אינסוף):
my $bad = 1 / 0; # dies: Illegal division by zero
מודולו#
% מחזיר את שארית המספר השלם. שני האופרנדים מומרים תחילה למספרים שלמים; סימן התוצאה עוקב אחר האופרנד הימני (״סימן המחלק״ בנוסח Perl, כמו ב־Python, בניגוד ל־C).
17 % 5 # 2
-17 % 5 # 3 -- result follows sign of $b ( 5)
17 % -5 # -3 -- result follows sign of $b (-5)
-17 % -5 # -2
לשארית בנקודה צפה, השתמשו ב־POSIX::fmod מ־POSIX.
העלאה בחזקה#
** מקבל כל זוג מספרים כולל מעריכים שאינם שלמים:
2 ** 10 # 1024
2 ** 0.5 # 1.4142135623730951 -- square root
$x ** -1 # 1/$x -- reciprocal
עבור sqrt, הפונקציה הייעודית sqrt ברורה יותר (והיא אונרית בעלת שם, ולכן היא מפענחת ארגומנט אחד בחמדנות - ראו קדימות).
+ אונרי ו־- אונרי#
- אונרי שולל. + אונרי הוא no-op על מספרים; השימוש המעשי היחיד שלו הוא לאלץ הקשר מספרי, או ליישב מקרה קצה תחבירי שבו Perl היה אחרת מתייחס לטוקן הבא כשם פונקציה:
sub foo { 42 }
print foo (1+2)*3; # prints 42*3 ... wait, no:
# parses as: print( foo(1+2) ) * 3
# because foo(...) sticks to the parens.
print foo +(1+2)*3; # parses as: print( foo + ((1+2)*3) )
# the unary + signals "not a function call"
תזדקקו לכך לעתים נדירות. הדבר מתועד מפני שהוא מופיע בקוד ישן יותר.
השמה מורכבת#
לכל אופרטור אריתמטי בינארי יש צורת השמה מורכבת (+=, -=, *=, /=, %=, **=). ראו השמה.
ראו גם#
אופרטורי מחרוזות -
.ו־x, המקבילות המחרוזתיות של+ו־*.השוואה מספרית -
< <= == > >= != <=>.קדימות - טבלה מלאה.