Mi piacerebbe eseguire alcune variazioni contorte del compito @a = @b || @c
, con l'intento di prendere @b
se non vuoto (quindi vero in senso booleano), @c
altrimenti. La documentazione mi dice esplicitamente che non posso. (Ed è proprio per il fatto, troppo!)Perché non posso assegnare @b || da @c a @a in Perl?
Il "||", "//" e "& &" operatori restituiscono l'ultimo valore valutato (a differenza di C "||" e "& & ", che restituisce 0 o 1).
[...]
In particolare, ciò significa che non si dovrebbe usare questo per la selezione tra due aggregati per l'assegnazione:
@a = @b || @c; # this is wrong @a = scalar(@b) || @c; # really meant this @a = @b ? @b : @c; # this works fine, though
Purtroppo, in realtà non Dimmi perchè.
Quello che mi aspettavo che sarebbe successo era questo:
@a =
è un compito array, inducendo un contesto di lista sul lato destro della strada.@b || @c
è il lato destro, da valutare nel contesto dell'elenco.||
è di tipo C in cortocircuito logico o. Valuta da sinistra a destra (se necessario) e propaga il contesto.@b
viene valutato nel contesto dell'elenco. Se true (, ovvero, non vuoto), viene restituito.- in caso contrario,
@c
viene valutato anche nel contesto dell'elenco e restituito.
Ovviamente, la mia penultima affermazione è errata. Perché? E, cosa più importante, quale parte della documentazione o delle fonti spiega questo comportamento?
PS: fuori dal campo di applicazione della domanda, il motivo per cui mi astengo dal suggerire la documentazione di utilizzare l'operatore ternario è che il mio @b
è in realtà un temporaneo (un risultato di chiamata di funzione).
La riga che dice "intendeva veramente questo" ti dice perché. –
È più che un motivo per me. Ma sono di parte. –
Penso piuttosto che il commento "intendeva veramente questo" dovrebbe essere cambiato in "davvero significa questo". In questo modo, mi aspettavo che il cambiamento scalare() impostasse @a uguale a @b - cioè che fosse quello che l'AUTORE realmente DEVE usare - che ovviamente non è il caso. Invece, la prima riga in realtà significa la seconda linea; entrambi ottengono lo stesso risultato, che non è la risposta desiderata. – Rini