אופרטורים לוגיים#

המשפחה הבוליאנית - AND מקצר, OR, defined-or; אחיהם בצורת־מילה בעלי הקדימות הנמוכה; השלילות; ו־xor.

אופרטור

נקרא

קיצור

מחזיר

קדימות

!

not

לא רלוונטי

1 מנורמל או ""

גבוהה

&&

and

כן

שמאל אם שקר, אחרת ימין (האופרנד)

גבוהה

||

or

כן

שמאל אם אמת, אחרת ימין (האופרנד)

גבוהה

//

defined-or

כן

שמאל אם מוגדר, אחרת ימין (אופרנד)

גבוהה

xor

או בלעדי

לא

1 מנורמל או ""

נמוכה מאוד

not

not

לא רלוונטי

1 מנורמל או ""

נמוכה מאוד

and

and

כן

זהה ל־&&

נמוכה מאוד

or

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).

צורות מורכבות#

לשלושה מהאופרטורים הלוגיים יש צורות השמה מורכבות:

מורכב

משמעות

שימוש

&&=

$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

הפניה צולבת להדרכה#

היסודות הרעיוניים של עמוד זה מכוסים בהדרכת הלוגיקה הבוליאנית:

ראו גם#

  • ביטים - אותם אופרטורים בוליאניים המיושמים על ביטי מספר שלם במקביל.

  • שילוש - ?:, בחירה לוגית כביטוי.

  • השוואה מספרית והשוואת מחרוזות - מייצרים את הקלטים הבוליאניים שהאופרטורים בעמוד זה משלבים.

  • משתני שגיאה - $! ו־$@ הם הערכים שאתם בדרך כלל מציבים בצד הימני של ניב ה־or die שלמענו נוצרו האופרטורים בצורת־מילה של עמוד זה.