אופרטורים אריתמטיים#

מערך הפעולות של מחשבון ארבע־הפעולות המספרי, בתוספת מודולו והעלאה בחזקה, בתוספת אופרטורי הסימן האונריים.

אופרטור

פעולה

אריות

אסוציאטיביות

**

העלאה בחזקה

בינארי

ימין

*

כפל

בינארי

שמאל

/

חילוק

בינארי

שמאל

%

מודולו

בינארי

שמאל

+

חיבור

בינארי

שמאל

-

חיסור

בינארי

שמאל

+

פלוס אונרי

אונרי

ימין

-

שלילה אונרית

אונרי

ימין

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 numeric warning under 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"

תזדקקו לכך לעתים נדירות. הדבר מתועד מפני שהוא מופיע בקוד ישן יותר.

השמה מורכבת#

לכל אופרטור אריתמטי בינארי יש צורת השמה מורכבת (+=, -=, *=, /=, %=, **=). ראו השמה.

ראו גם#