2013-03-04 11 views
11

Dies ist wahrscheinlich ein kleiner Punkt, aber ich habe mich gefragt, warum Perl des logischen Operatoren (&&, || und !) Vorrang vor den leicht verständlichen „Englisch“ logischen Operatoren (and, or und not). Gibt es einen Vorteil der Verwendung der vorherigen Menge und einen Nachteil der Verwendung der letzteren Menge in einem Skript?Warum Perls logische Operatoren &&, ||,! Vorrang vor und, oder, und nicht?

+0

Weil Larry Wall es so mochte? – mvp

+1

Wenn sie identisch wären, wäre es nicht notwendig, beide Versionen zu behalten - nur eine würde ausreichen, um sie zu behalten. Da Larry ein Linguist ist und gerne englische Wörter in seiner neuen Sprache verwendet, führt er diese ein (neben "außer" und anderen). Und natürlich gab er diesen Wörtern Bedeutung, die ihm besser gefielen (und immer noch anders als C-Stil-Operatoren). – mvp

Antwort

13

Wenn || und or die gleiche Priorität haben, dann

return some_func $test1 || $test2; 

würde bedeuten,

return some_func($test1) || $test2; 

statt

return some_func($test1 || $test2); 

oder

würde bedeuten,

some_func($test1 or die); 

statt

some_func($test1) or die; 

Keine dieser Änderungen wünschenswert sind.

Und während man or Debatte könnte leichter als || verstanden wird, ist es schwieriger zu lesen. Es ist einfacher, Code zu lesen, wenn die Operatoren nicht wie ihre Operanden aussehen.

21

Die ursprünglichen &&, || und ! Operatoren sind hohe Priorität der Sprache C entsprechen.

Die neueren (aber immer noch alten) Operatoren and, or und not wurden hinzugefügt, um einige gängige Konstrukte zu vereinfachen. Zum Beispiel vergleichen:

open my $fh, '<', $filename || die "A horrible death!"; 
open my $fh, '<', $filename or die "A horrible death!"; 

Die erste von diesen ist falsch; die hohe Priorität || bindet mit $filename und die das ist nicht was Sie wollen. Die zweite ist richtig; die niedrige Priorität or bedeutet, dass die fehlenden Klammern nicht zu Mehrdeutigkeiten führen.

+5

+1, weil dies der tatsächliche Grund ist, den Larry Wall in * Programming Perl * gibt. –

-3

Umwandlung Kommentar zu einer Antwort:

Wenn diese Operatoren bevorzugt identisch waren, wäre es nicht notwendig sein, beide Versionen zu halten - genug wäre nur eine Version mit.

Aber Larry Wall ist ein Linguist, und er mochte es wirklich, einfache englische Wörter in seiner neuen Sprache zu verwenden. Also stellte er diese englischen Stil Betreiber (neben unless und andere).

Um C-Stil-Operatoren und ihre klassische Bedeutung zu behalten, musste er neue Schlüsselwörter nicht überflüssig machen. Deshalb gab er diesen Operatoren eine etwas andere Bedeutung, die er besser fand. Dieser Unterschied stellte sich also als vorrangig für den Betreiber heraus.

+0

Das ist nicht wahr: Es hat nichts mit Larrys Vorliebe für englische Wörter zu tun. "und" und "oder" wurden zusätzlich zu "&&" und "||" eingefügt, um identische Operatoren mit einer niedrigeren Bindungspriorität zu bieten. Sie sind besonders nützlich in Perl, da Funktionsaufrufe keine Klammern um die Parameter benötigen. – Borodin

+0

Ist das nicht, was ich gesagt habe? Wenn sie in der Priorität identisch wären, würden "und" und "oder" heute nicht existieren. Und Englisch-Stil Konstrukte bieten sicherlich mehr Flexibilität, ich bestreite nicht, dass entweder – mvp

+1

Nein, es ist nicht das, was Sie gesagt haben. * "[Larry Wall] benutzte wirklich einfache englische Wörter in seiner neuen Sprache. Also stellte er diese englischen Stil-Operatoren vor ... Er musste neue Schlüsselworte nicht überflüssig machen, denen er eine etwas andere Bedeutung zuwies Betreiber, die er besser mochte. "* ist Märchen Unsinn. – Borodin

Verwandte Themen