Questo è probabilmente un piccolo punto, ma mi chiedevo il motivo per cui gli operatori logici di Perl (&&
, ||
, e !
) hanno la precedenza sulle operatori di facile comprensione "inglesi" logiche (and
, or
e not
). C'è qualche vantaggio nell'usare il precedente set e qualche svantaggio nell'usare quest'ultimo set in uno script?Perché gli operatori logici di Perl &&, ||,! avere la precedenza su e, o, e non?
risposta
Se ||
e or
avevano la stessa precedenza, quindi
return some_func $test1 || $test2;
significherebbe
return some_func($test1) || $test2;
anziché
return some_func($test1 || $test2);
o
some_func $test1 or die;
significherebbe
some_func($test1 or die);
anziché
some_func($test1) or die;
Nessuno di questi cambiamenti sono desiderabili.
E mentre si potrebbe discutere or
è più facilmente comprensibile di ||
, è più difficile da leggere. È più semplice leggere il codice quando gli operatori non assomigliano ai loro operandi.
Gli operatori originali &&
, ||
e !
hanno un'alta precedenza rispetto al linguaggio C.
Gli operatori più recenti (ma ancora vecchi) and
, or
e not
sono stati aggiunti per semplificare alcuni costrutti comuni. Ad esempio, confrontare:
open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";
Il primo di questi non è corretto; l'alta priorità ||
si lega con $filename
e die
che non è ciò che si desidera. Il secondo è corretto; la bassa priorità or
significa che le parentesi mancanti non portano ad ambiguità.
+1 perché questo è il motivo reale che Larry Wall fornisce in * Programming Perl *. –
conversione di commento a una risposta:
Se questi operatori erano identiche di preferenza, non sarebbe necessario mantenere entrambe le versioni - avendo solo una versione sarebbe sufficiente.
Ma Larry Wall è un linguista e gli piaceva molto usare parole inglesi semplici nella sua nuova lingua. Così, ha introdotto questi operatori in stile inglese (insieme a unless
e altri).
Per mantenere gli operatori in stile C e il loro significato classico, doveva rendere le nuove parole chiave non ridondanti. Per questo motivo ha assegnato un significato leggermente diverso a questi operatori che gli piaceva di più. Quindi questa differenza si è rivelata la precedenza degli operatori.
Non è vero: non ha nulla a che fare con la predilezione di Larry per le parole inglesi. 'and' e' or' sono stati inclusi in aggiunta a '&&' e '||' puramente per offrire operatori identici con una priorità di rilegatura inferiore. Sono particolarmente utili in Perl perché le chiamate di funzione non richiedono parentesi attorno ai parametri. – Borodin
Non è quello che ho detto? Se fossero identici in priorità, 'and' e' or' non esisterebbero oggi. E i costrutti in stile inglese certamente offrono una maggiore flessibilità, non sto contestando che sia lo – mvp
No, non è quello che hai detto. * "[Larry Wall] è piaciuto molto usare semplici parole inglesi nella sua nuova lingua, quindi ha introdotto questi operatori in stile inglese ... Aveva bisogno di creare nuove parole chiave non ridondanti \ [così \] ha assegnato un significato leggermente diverso a questi operatori che gli piacevano di più. "* è un'assurdità da favola. – Borodin
- 1. Quali operatori logici C++ utilizzate: e, o, non e gli operatori di stile ik o C? perché?
- 2. Operatori logici ("e", "o") nel batch DOS
- 3. Precedenza degli operatori logici in C
- 4. SQL e logici operatori e controlli nulli
- 5. Qual è la precedenza di ~ e perché?
- 6. Gli operatori di confronto e 'is' - la precedenza degli operatori in python?
- 7. Operatori logici AP Computer
- 8. Perché esiste una distinzione tra operatori logici e bit a bit in Java e C#?
- 9. Gli operatori Perl sono "scoperti" e non progettati?
- 10. Cambio JavaScript con operatori logici?
- 11. sovraccarico + =, +, == e = gli operatori
- 12. CUDA: Perché gli operatori bit a bit sono talvolta più veloci degli operatori logici?
- 13. Perché l'override == deve avere la precedenza su uguale a?
- 14. Perl confronta operatori e stringhe "numeri"
- 15. Ricerca SQL con operatori logici
- 16. operatori logici in Modelli di chiusura
- 17. Sovraccarico e precedenza dell'operatore
- 18. F # Operatori personalizzato Precedenza
- 19. Gli operatori logici VBS inizializzano le variabili vuote?
- 20. precedenza degli operatori
- 21. ragione dell'esistenza di operatori logici non-corto circuito
- 22. O e e operatori di query elasticsearch
- 23. perché Java revert operatori logici, mentre in fase di compilazione
- 24. operatori logici (AND, OR) con NA, TRUE e FALSE
- 25. Prolog precedenza degli operatori e regole di corrispondenza
- 26. Java - compareTo e gli operatori
- 27. query Linq 'e' 'o' operatori
- 28. precedenza degli operatori in C#
- 29. Perché la -n bash e gli operatori di test -z non inversi per $ @
- 30. Operandi per || e gli operatori && devono essere convertibili in valori scalari logici
Perché a Larry Wall è piaciuto così? – mvp
Se fossero identici di preferenza, non sarebbe necessario mantenere entrambe le versioni - solo una sarebbe sufficiente per mantenere. Poiché Larry è un linguista e amava usare semplici parole inglesi nella sua nuova lingua, ha introdotto queste (insieme a 'unless' e altri). E, naturalmente, ha assegnato a queste parole un significato che gli piaceva (e ancora diverso dagli operatori in stile C) – mvp