Τελεστές αριθμητικής σύγκρισης#

Επτά τελεστές που συγκρίνουν δύο αριθμούς και επιστρέφουν είτε λογική τιμή (οι πρώτοι έξι) είτε τριμερές αποτέλεσμα (<=>).

Τελεστής

Ερώτηση

Επιστρέφει

<

μικρότερο από

αληθές / ψευδές

<=

μικρότερο ή ίσο

αληθές / ψευδές

==

ίσο

αληθές / ψευδές

>=

μεγαλύτερο ή ίσο

αληθές / ψευδές

>

μεγαλύτερο από

αληθές / ψευδές

!=

άνισο

αληθές / ψευδές

<=>

τριμερής (sort)

-1, 0 ή +1

Και οι επτά εξαναγκάζουν τους δύο τελεστέους σε αριθμούς πριν τη σύγκριση.

$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 πίσω από την ==.