אופרטורים אריתמטיים#
מערך הפעולות של מחשבון ארבע־הפעולות המספרי, בתוספת מודולו והעלאה בחזקה, בתוספת אופרטורי הסימן האונריים.
אופרטור | פעולה | אריות | אסוציאטיביות |
|---|---|---|---|
| העלאה בחזקה | בינארי | ימין |
| כפל | בינארי | שמאל |
| חילוק | בינארי | שמאל |
| מודולו | בינארי | שמאל |
| חיבור | בינארי | שמאל |
| חיסור | בינארי | שמאל |
| פלוס אונרי | אונרי | ימין |
| שלילה אונרית | אונרי | ימין |
All arithmetic operators evaluate their operands in numeric context
strings are coerced via the rule ”leading numeric prefix wins, the rest is ignored (with an
Argument "..." isn't numericwarning underuse 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, המקבילות המחרוזתיות של+ו־*.השוואה מספרית -
< <= == > >= != <=>.קדימות - טבלה מלאה.