Τελεστές αριθμητικής σύγκρισης#
Επτά τελεστές που συγκρίνουν δύο αριθμούς και επιστρέφουν είτε λογική τιμή (οι πρώτοι έξι) είτε τριμερές αποτέλεσμα (<=>).
Τελεστής | Ερώτηση | Επιστρέφει |
|---|---|---|
| μικρότερο από | αληθές / ψευδές |
| μικρότερο ή ίσο | αληθές / ψευδές |
| ίσο | αληθές / ψευδές |
| μεγαλύτερο ή ίσο | αληθές / ψευδές |
| μεγαλύτερο από | αληθές / ψευδές |
| άνισο | αληθές / ψευδές |
| τριμερής (sort) |
|
Και οι επτά εξαναγκάζουν τους δύο τελεστέους σε αριθμούς πριν τη σύγκριση.
$age >= 18 # true if 18 or older
$count == 0 # true if numerically zero
$x != $y # true if they differ numerically
$a <=> $b # -1 if $a < $b, 0 if equal, +1 if $a > $b
Η == είναι για αριθμούς, η eq είναι για συμβολοσειρές#
Αυτό είναι το πιο συνηθισμένο σφάλμα που αποστέλλουν νέοι προγραμματιστές Perl. Η == συγκρίνει αριθμητικά - οι δύο τελεστέοι περνούν από αριθμητικό εξαναγκασμό, και κάθε μη αριθμητική συμβολοσειρά γίνεται 0:
"foo" == "bar" # TRUE -- both coerce to 0
"42x" == "42y" # TRUE -- both coerce to 42
"1e2" == 100 # TRUE -- "1e2" is 100 in scientific notation
Για ισότητα συμβολοσειρών, χρησιμοποιήστε eq:
"foo" eq "bar" # FALSE -- the actual question
"42x" eq "42y" # FALSE
Αν η use warnings είναι σε ισχύ, η προειδοποίηση Argument "..." isn't numeric ενεργοποιείται κάθε φορά που η == (ή οποιοσδήποτε άλλος αριθμητικός τελεστής) βλέπει μη αριθμητική συμβολοσειρά. Αυτή η προειδοποίηση είναι φίλος σας.
<=> - ο τελεστής spaceship#
Ο <=> επιστρέφει -1 αν το αριστερό είναι μικρότερο, 0 αν ίσα, +1 αν μεγαλύτερο. Είναι ο συγκριτής ταξινόμησης:
my @sorted = sort { $a <=> $b } @numbers; # ascending
my @rev = sort { $b <=> $a } @numbers; # descending
# multi-key: by length, ties broken by content
my @lines = sort { length($a) <=> length($b) || $a cmp $b } @raw;
Το μοτίβο cmp1 || cmp2 || cmp3 λειτουργεί επειδή ο <=> επιστρέφει 0 σε ισοπαλία και ο || περνάει παρακάτω στο 0. Δείτε logical.
Ο <=> και ο cmp είναι οι μόνοι δύο τελεστές αυτής της οικογένειας που δεν είναι λογικοί - είναι ακεραιότιμοι και υπάρχουν για ταξινόμηση, όχι για συνθήκες if.
Ισότητα κινητής υποδιαστολής#
Η == σε αριθμούς κινητής υποδιαστολής είναι ακριβής ισότητα bit-προς-bit. Για τιμές παραγόμενες από αριθμητική κινητής υποδιαστολής αυτό σχεδόν ποτέ δεν είναι αυτό που θέλετε:
0.1 + 0.2 == 0.3 # FALSE -- 0.30000000000000004
Συγκρίνετε με ανοχή:
abs($a - $b) < 1e-9 # absolute tolerance
abs($a - $b) < 1e-9 * abs($a) # relative tolerance, when $a ≠ 0
Η abs είναι ένας ονομασμένος μοναδιαίος τελεστής.
Η αλυσίδωση δεν είναι μαγική#
Η Perl δεν υποστηρίζει μαθηματική αλυσίδωση συγκρίσεων. Η $a < $b < $c δεν ελέγχει «ο $b είναι μεταξύ $a και $c» - αναλύεται ως ($a < $b) < $c, όπου η πρώτη σύγκριση δίνει λογική τιμή ("" ή 1) που στη συνέχεια συγκρίνεται αριθμητικά με $c:
1 < 5 < 3 # parses as (1 < 5) < 3
# = 1 < 3
# = TRUE -- which is *not* what you meant.
Γράψτε τη σύζευξη ρητά:
$a < $b && $b < $c # the actual "between" test
Προτεραιότητα#
Οι τελεστές σύγκρισης βρίσκονται στη γραμμή 11 του πίνακα precedence - χαλαρότεροι από τους αριθμητικούς τελεστές (οπότε η $a + $b == $c + $d λειτουργεί), σφιχτότεροι από τους λογικούς τελεστές (οπότε η $a < $b && $c > $d λειτουργεί). Είναι μη προσεταιριστικοί: η $a < $b < $c δεν είναι μη έγκυρη, αλλά η προειδοποίηση μη προσεταιριστικότητας που εξηγήθηκε παραπάνω ισχύει.
Δείτε επίσης#
String comparison -
eq ne lt le gt ge cmp, η οικογένεια λεξικογραφικής σειράς.Logical operators - συνδυασμός αποτελεσμάτων σύγκρισης.
<=>in sort - η κανονική περίπτωση χρήσης.Boolean Logic for Perl Programmers
the «two flavours of comparison» overview that motivates the numeric/string split.
Numbers and strings - πότε ένα βαθμωτό εξαναγκάζεται σε αριθμό, και η ιστορία ακρίβειας/Inf/NaN πίσω από την
==.