Λογικοί τελεστές#
Η οικογένεια λογικών τιμών - βραχυκυκλωτικό AND, OR, defined-or· τα αδέλφια τους σε μορφή λέξης χαμηλής προτεραιότητας· οι αρνήσεις· και xor.
Τελεστής | Διαβάζεται ως | Βραχυκύκλωμα | Επιστρέφει | Προτεραιότητα |
|---|---|---|---|---|
| όχι | δ/ε | κανονικοποιημένο | υψηλή |
| και | ναι | αριστερό αν ψευδές, αλλιώς δεξιό (ο τελεστέος) | υψηλή |
| ή | ναι | αριστερό αν αληθές, αλλιώς δεξιό (ο τελεστέος) | υψηλή |
| defined-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).
Σύνθετες μορφές#
Τρεις από τους λογικούς τελεστές έχουν σύνθετες μορφές ανάθεσης:
Σύνθετη | Σημαίνει | Χρήση |
|---|---|---|
|
| «στένεψε αν αληθές τώρα» |
|
| «προεπιλογή αν ψευδές τώρα» |
|
| «προεπιλογή αν 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.-
NAND/NOR.
Δείτε επίσης#
Bitwise - οι ίδιοι λογικοί τελεστές εφαρμοσμένοι σε bits ακεραίων παράλληλα.
Ternary -
?:, λογική επιλογή ως έκφραση.Numeric comparison και string comparison - παράγουν τις λογικές εισόδους που συνδυάζουν οι τελεστές αυτής της σελίδας.
Error variables - οι
$!και$@είναι οι τιμές που τυπικά βάζετε στη δεξιά πλευρά του ιδιώματοςor dieγια το οποίο φτιάχτηκαν οι τελεστές σε μορφή λέξης αυτής της σελίδας.