Cosa c'è di sbagliato in questa sintassi booleano Perl?
-
19-09-2019 - |
Domanda
Ho hackero ho bisogno di impiegare in queste condizioni:
- E 'l'ultima pagina di dati.
- Non è la prima pagina, neanche.
- Non c'è un numero di pagina a grandezza naturale, anche di elementi di dati.
Così ho provato questo codice:
my $use_hack =
$last_page_number == $current_page_number and
$page_number != 1 and
$total_items % $items_per_page != 0;
E continuo a ricevere questo Useless use of numeric ne (!=) in void context
avvertimento circa l'ultima condizione e sta valutando vero quando $total_items % $items_per_page = 0
.
say 'NOT EVEN' if $total_items % $items_per_page != 0; #works properly, though...
Ho provato varie combinazioni di parentesi per farlo bene, ma nulla sembra funzionare.
Soluzione
D'accordo, precedenza degli operatori. and
ha quasi la precedenza più basso di qualsiasi operatore in Perl, quindi Perl stava valutando l'espressione in un ordine strano. Il passaggio a &&
invece mi ha fatto risultati corretti. Blarg.
EDIT:
Come Philip Potter ha sottolineato di seguito, Perl Best Practices (p.70) raccomanda di usare sempre &&,||, !
per le condizioni booleane - limitando and or
e not
per il flusso di controllo a causa della loro bassa la precedenza. (E si spinge fino a dire non usare mai per and
e not
, solo or
per la logica di fallback.)
Grazie a tutti!
Altri suggerimenti
Racchiudere il RHS tra parentesi:
my $use_hack = (
$last_page_number == $current_page_number and
$page_number != 1 and
$total_items % $items_per_page != 0);
Assegnazione (=
) sta avendo precedenza maggiore rispetto a and
operatore. Si può dare un'occhiata alla Perl Precedenza degli operatori .