In realtà non è vero. Tutti gli operatori del C che vengono
riprodotti in Perl hanno la stessa precedenza che hanno in C. Il problema si
presenta con gli operatori che in C non esistono, in special modo le funzioni
che conferiscono un contesto di lista a tutto quello che sta alla loro destra,
ad esempio print, chmod, exec e così via. Queste funzioni sono
chiamate "operatori di lista" e appaiono come tali nella tabella delle
precedenze di perlop.
Un errore comune è scrivere:
unlink $file || die "caos";
Esso viene interpretato come:
unlink ($file || die "caos");
Per evitare questo problema, usate delle parentesi in più oppure
usate l'operatore or che ha una precedenza bassissima:
(unlink $file) || die "caos";
unlink $file or die "caos";
Gli operatori "in lingua inglese" (and, or, xor e not) hanno una
precedenza volutamente inferiore a quella degli operatori di lista, esattamente
per le situazione come quella menzionata sopra.
Un altro operatore con una precedenza sorprendente è l'operatore di
elevamento a potenza. Ha una precedenza superiore anche al meno unario,
facendo sì che -2**2 produca un quattro negativo anzichè
positivo. Inoltre è associativo a destra, e questo vuol dire che
2**3**2 è due elevato alla nona potenza, non otto al quadrato.
Benché abbia la stessa precedenza che ha in C, l'operatore ?: del
Perl produce un lvalue [un valore che può trovarsi a sinistra di un
operatore di assegnamento, NdT]. Questo codice assegna $x a $a o $b, a seconda del
valore di verità di $forse:
($forse ? $a : $b) = $x;
|