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?
Antwort
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.
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.
+1, weil dies der tatsächliche Grund ist, den Larry Wall in * Programming Perl * gibt. –
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.
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
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
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
- 1. Logische Operatoren ("und", "oder") im DOS-Stapel
- 2. Operator Vorrang der Zuweisung und bedingte Operatoren
- 3. Operator Vorrang - Arithmetische und bedingte Operatoren
- 4. logische Operatoren oder vs || (Doppelrohr) in php
- 5. Boolesche Operatoren Vorrang
- 6. Mysql oder/und Vorrang?
- 7. MySQL logische Operatoren
- 8. Warum sind "und" und "oder" Operatoren in Python nicht?
- 9. Grundlegende Programmierübung über logische Operatoren
- 10. Verständnis Vorrang der Zuweisung und logischer Operatoren in Ruby
- 11. Java-Programmierung: logische Operatoren und Funktionen in Android-Anwendung
- 12. Vorrang- und Bitmaskenoperationen
- 13. Logische Operatoren (AND, OR) mit NA, WAHR und FALSCH
- 14. Gibt es irgendeine Weisheit hinter "und", "oder" Operatoren in Ruby?
- 15. Was ist der Vorrang von ~ und warum?
- 16. Python: logische oder bitweise Operator UND
- 17. Während Schleife und logische Operationen
- 18. Operator Vorrang in C (! = Und |)
- 19. && = und || = Operatoren
- 20. Entwerfen eines Datenmodells, das logische Operatoren enthält
- 21. Warum sind logische Verknüpfungen und boolesche Werte in Coq getrennt?
- 22. Hat R zitatähnliche Operatoren wie Perls qw()?
- 23. Devise Vorrang vor Filtern von Scope Controller und Application Controller
- 24. Vorrang und Assoziativität in Operationen in Compilern
- 25. Python-Operator Vorrang - und vs größer als
- 26. PHP || und && logische Optimierung
- 27. Warum hat die Paketsichtbarkeit Vorrang vor der Unterklassensichtbarkeit?
- 28. Annotation-basierte und xml-basierte Transaktionsdefinitionen Vorrang
- 29. Logische UND in Forth?
- 30. Warum hat der Zeigerabfall Vorrang vor einer abgeleiteten Vorlage?
Weil Larry Wall es so mochte? – mvp
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