Αριθμητικοί τελεστές#

Το αριθμητικό σύνολο τεσσάρων πράξεων αριθμομηχανής, επιπλέον υπόλοιπο και ύψωση σε δύναμη, επιπλέον οι μοναδιαίοι τελεστές προσήμου.

Τελεστής

Πράξη

Πληθικότητα

Προσεταιριστικότητα

**

ύψωση σε δύναμη

δυαδικός

δεξιά

*

πολλαπλασιασμός

δυαδικός

αριστερά

/

διαίρεση

δυαδικός

αριστερά

%

υπόλοιπο

δυαδικός

αριστερά

+

πρόσθεση

δυαδικός

αριστερά

-

αφαίρεση

δυαδικός

αριστερά

+

μοναδιαίο συν

μοναδιαίος

δεξιά

-

μοναδιαία άρνηση

μοναδιαίος

δεξιά

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 είναι πιο σαφής (και ονομασμένος μοναδιαίος τελεστής, οπότε αναλύεται με ένα όρισμα άπληστα - δείτε precedence).

Μοναδιαίο + και μοναδιαίο -#

Το μοναδιαίο - αρνείται. Το μοναδιαίο + είναι 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"

Σπάνια θα το χρειαστείτε. Τεκμηριώνεται επειδή εμφανίζεται σε παλαιότερο κώδικα.

Σύνθετη ανάθεση#

Κάθε δυαδικός αριθμητικός τελεστής έχει σύνθετη μορφή ανάθεσης (+=, -=, *=, /=, %=, **=). Δείτε assignment.

Δείτε επίσης#