Λογικοί τελεστές#

Η οικογένεια λογικών τιμών - βραχυκυκλωτικό AND, OR, defined-or· τα αδέλφια τους σε μορφή λέξης χαμηλής προτεραιότητας· οι αρνήσεις· και xor.

Τελεστής

Διαβάζεται ως

Βραχυκύκλωμα

Επιστρέφει

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

!

όχι

δ/ε

κανονικοποιημένο 1 ή ""

υψηλή

&&

και

ναι

αριστερό αν ψευδές, αλλιώς δεξιό (ο τελεστέος)

υψηλή

||

ή

ναι

αριστερό αν αληθές, αλλιώς δεξιό (ο τελεστέος)

υψηλή

//

defined-or

ναι

αριστερό αν ορισμένο, αλλιώς δεξιό (τελεστέος)

υψηλή

xor

αποκλειστικό ή

όχι

κανονικοποιημένο 1 ή ""

πολύ χαμηλή

not

όχι

δ/ε

κανονικοποιημένο 1 ή ""

πολύ χαμηλή

and

και

ναι

ίδιο με &&

πολύ χαμηλή

or

ή

ναι

ίδιο με ||

πολύ χαμηλή

Η πλήρης εννοιολογική αντιμετώπιση αυτών των τελεστών - τι σημαίνει η αλήθεια, γιατί η && επιστρέφει έναν από τους τελεστέους, πώς ταιριάζουν η συνεπαγωγή και η XOR, οι μετασχηματισμοί De Morgan που σας επιτρέπουν να απλοποιήσετε μπερδεμένες συνθήκες - βρίσκεται στον οδηγό Boolean Logic for Perl Programmers. Αυτή η σελίδα είναι ο σύντροφος αναφοράς τελεστών.

Βραχυκύκλωμα και επιστροφή τελεστέου#

Τα && και || αποτιμώνται από αριστερά προς τα δεξιά και σταματούν μόλις προσδιοριστεί το αποτέλεσμα.

  • A && B - αν το A είναι ψευδές, επιστρέφει το A χωρίς να αποτιμήσει το B. Αλλιώς επιστρέφει το B.

  • A || B - αν το A είναι αληθές, επιστρέφει το A χωρίς να αποτιμήσει το B. Αλλιώς επιστρέφει το B.

Η τιμή επιστροφής είναι ο ίδιος ο τελεστέος, όχι ένα κανονικοποιημένο αληθές/ψευδές. Αυτό είναι που κάνει τα ιδιώματα προεπιλογής της Perl να λειτουργούν:

my $port = $config{port} || 8080;            # operand of ||, not boolean
my $name = $user_input  || "anonymous";
my $val  = $cache{$key} ||= compute($key);   # ||= sets if currently false

Για σύγκριση, οι !, not και xor κανονικοποιούν: επιστρέφουν πάντα είτε 1 είτε την κενή συμβολοσειρά "".

// - defined-or#

Ο // βραχυκυκλώνει βάσει ορισμένης τιμής αντί για αλήθεια:

  • A // B - αν το A είναι ορισμένο, επιστρέφει το A. Αλλιώς επιστρέφει το B.

Η διαφορά έχει σημασία όταν τα 0, "" ή "0" είναι νόμιμες τιμές αντί για υποκατάστατο «λείπει»:

my $port    = $config{port} || 8080;    # 0 means "use default" - wrong
my $port    = $config{port} // 8080;    # 0 means "0", undef means "default"
my $verbose = $opt{verbose} // 0;       # 0 is a real choice

Η //= είναι η σύνθετη μορφή:

$config{port} //= 8080;                 # set only if currently undef

xor#

Ο τελεστής αποκλειστικού-ή. Έχει μόνο τη μορφή λέξης πολύ χαμηλής προτεραιότητας (δεν υπάρχει ^^), και σε αντίθεση με τα and/or δεν βραχυκυκλώνει (δεν μπορεί - πρέπει να αποτιμηθούν και οι δύο πλευρές για να καθοριστεί το αποτέλεσμα):

if ($admin xor $guest) { ... }          # exactly one of the two

Το αποτέλεσμα είναι κανονικοποιημένο - 1 ή "", όχι τελεστέος. Για bitwise XOR σε ακεραίους, δείτε bitwise.

Συμβολικές έναντι μορφών λέξης - προτεραιότητα, όχι στυλ#

Οι &&, ||, ! δένουν σφιχτά (γραμμές 15–16). Οι and, or, not δένουν πολύ χαλαρά (γραμμές 22–24). Αυτό έχει σημασία στο σύνορο με την ανάθεση:

my $fh = open $h, '<', $path || die "no $path: $!";
#                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
# parses as: open $h, '<', ($path || die "no $path: $!")
# - open of "either $path or the die-message". Catastrophe.

my $fh = open $h, '<', $path or die "no $path: $!";
# parses as: ($fh = open $h, '<', $path) or die "no $path: $!"
# - what you meant.

Εμπειρικός κανόνας:

  • Μέσα σε μια έκφραση, όπου θέλετε η τιμή να ρέει σε μια μεταβλητή ή σε άλλον τελεστή: χρησιμοποιήστε &&, ||, !, //.

  • Μετά από μια πρόταση, όπου θέλετε μια παρενέργεια (die, warn, return) να ενεργοποιηθεί υπό συνθήκη: χρησιμοποιήστε or, and, not.

! και not#

Και οι δύο αρνούνται. Και οι δύο επιστρέφουν το κανονικό 1 ή "":

my $missing = ! $config{port};          # 1 if port is unset/0/""/"0"
return if not @items;                   # cleaner reading than `if !@items`

Ο ! δένει ψηλά (γραμμή 5)· ο not δένει πολύ χαμηλά (γραμμή 22).

Σύνθετες μορφές#

Τρεις από τους λογικούς τελεστές έχουν σύνθετες μορφές ανάθεσης:

Σύνθετη

Σημαίνει

Χρήση

&&=

$x = $x && $y

«στένεψε αν αληθές τώρα»

||=

$x = $x || $y

«προεπιλογή αν ψευδές τώρα»

//=

$x = $x // $y

«προεπιλογή αν undef τώρα»

$cache{$k} ||= compute($k);             # lazy populate
$cfg{port} //= 8080;                    # default that respects 0
$check     &&= validate($check);        # only if currently truthy

Παραπομπή σε οδηγό#

Τα εννοιολογικά θεμέλια αυτής της σελίδας καλύπτονται στον οδηγό λογικής τιμών:

  • Truthiness - τι θεωρεί η Perl ψευδές.

  • Operators - ο κανόνας επιστροφής τελεστέου, η συλλογιστική προτεραιότητας και ο τριαδικός ?: (που βρίσκεται στη δική του σελίδα σε αυτή την αναφορά).

  • Truth tables - και οι δεκαέξι δυαδικές συναρτήσεις και πώς γράφεται η κάθε μία στην Perl.

  • De Morgan - αναγωγή μπερδεμένων unless σε καθαρά if.

  • Functional completeness

    • NAND/NOR.

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

  • Bitwise - οι ίδιοι λογικοί τελεστές εφαρμοσμένοι σε bits ακεραίων παράλληλα.

  • Ternary - ?:, λογική επιλογή ως έκφραση.

  • Numeric comparison και string comparison - παράγουν τις λογικές εισόδους που συνδυάζουν οι τελεστές αυτής της σελίδας.

  • Error variables - οι $! και $@ είναι οι τιμές που τυπικά βάζετε στη δεξιά πλευρά του ιδιώματος or die για το οποίο φτιάχτηκαν οι τελεστές σε μορφή λέξης αυτής της σελίδας.