2013-03-04 11 views
11

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?

+0

Perché a Larry Wall è piaciuto così? – mvp

+1

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

risposta

13

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.

21

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

+5

+1 perché questo è il motivo reale che Larry Wall fornisce in * Programming Perl *. –

-3

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.

+0

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

+0

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

+1

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

Problemi correlati