אופרטורים לוגיים#
המשפחה הבוליאנית - AND מקצר, OR, defined-or; אחיהם בצורת־מילה בעלי הקדימות הנמוכה; השלילות; ו־xor.
אופרטור | נקרא | קיצור | מחזיר | קדימות |
|---|---|---|---|---|
| not | לא רלוונטי |
| גבוהה |
| and | כן | שמאל אם שקר, אחרת ימין (האופרנד) | גבוהה |
| or | כן | שמאל אם אמת, אחרת ימין (האופרנד) | גבוהה |
| defined-or | כן | שמאל אם מוגדר, אחרת ימין (אופרנד) | גבוהה |
| או בלעדי | לא |
| נמוכה מאוד |
| not | לא רלוונטי |
| נמוכה מאוד |
| and | כן | זהה ל־ | נמוכה מאוד |
| or | כן | זהה ל־ | נמוכה מאוד |
הטיפול הרעיוני המלא באופרטורים אלה - מה משמעות האמיתיוּת, מדוע && מחזיר אחד מהאופרנדים שלו, כיצד גרירה ו־XOR משתלבים, טרנספורמציות דה־מורגן שמאפשרות לכם לפשט תנאים סבוכים - נמצא בהדרכת לוגיקה בוליאנית למתכנתי Perl. עמוד זה הוא הליווי של מדריך־העיון לאופרטורים.
קיצור והחזרת אופרנד#
&& ו־|| מחושבים משמאל לימין ועוצרים ברגע שהתוצאה נקבעת.
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 או "", לא אופרנד. עבור XOR ביטי על מספרים שלמים, ראו ביטים.
צורות סמליות לעומת צורות־מילה - קדימות, לא סגנון#
&&, ||, ! נקשרים בחוזקה (שורות 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
הפניה צולבת להדרכה#
היסודות הרעיוניים של עמוד זה מכוסים בהדרכת הלוגיקה הבוליאנית:
אמיתיוּת - מה Perl מחשיב כשקר.
אופרטורים - כלל החזרת־האופרנד, הסקת הקדימות, והשילוש
?:(שנמצא בעמוד משלו במדריך עיון זה).טבלאות אמת - כל שש־עשרה הפונקציות הבינאריות וכיצד לכתוב כל אחת ב־Perl.
דה־מורגן - צמצום
unlessסבוך ל־ifנקי.-
NAND/NOR.
ראו גם#
ביטים - אותם אופרטורים בוליאניים המיושמים על ביטי מספר שלם במקביל.
שילוש -
?:, בחירה לוגית כביטוי.השוואה מספרית והשוואת מחרוזות - מייצרים את הקלטים הבוליאניים שהאופרטורים בעמוד זה משלבים.
משתני שגיאה -
$!ו־$@הם הערכים שאתם בדרך כלל מציבים בצד הימני של ניב ה־or dieשלמענו נוצרו האופרטורים בצורת־מילה של עמוד זה.