Domanda

Questo frammento di codice Perl nel mio programma dà il risultato sbagliato.

$condition ? $a = 2 : $a = 3 ;
print $a;

Non importa quale sia il valore di $condition è, l'output è sempre 3, come mai?

È stato utile?

Soluzione

Questo è spiegato nel Perl documentazione.

A causa della precedenza degli operatori Perl, l'istruzione viene analizzata come

($condition ? $a= 2 : $a ) = 3 ;

Perché il ?:L'operatore produce un risultato assegnabile, 3 viene assegnato al risultato della condizione.

Quando $condizione è vera significa ($a=2)=3 dando $a=3

Quando $condizione è falsa significa che ($a)=3 restituisce $a=3

Il modo corretto di scriverlo è

$a = ( $condition ? 2 : 3 );
print $a;

Ne siamo stati morsi al lavoro, quindi scrivo qui sperando che altri lo trovino utile.

Altri suggerimenti

Una volta che hai la sensazione che potresti soffrire di problemi di precedenza, un trucco per capire cosa Perl pensava che intendessi:

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;'

Nel tuo caso, questo ti mostrerà:

(($condition ? ($a = 2) : $a) = 3);
print($a);
-e syntax OK

...a quel punto dovresti dire "oh, questo spiega tutto"!

Giusto per estendere la risposta precedente...Se, per qualsiasi motivo, i compiti devono far parte del condizionale, ti consigliamo di scriverlo in questo modo:

$condition ? ($a=2) : ($a=3);

Ciò sarebbe utile se stai assegnando a variabili diverse in base alla condizione.

$condition ? ($a=2) : ($b=3);

E se stai scegliendo la variabile, ma assegnando la stessa cosa qualunque cosa accada, potresti anche fare questo:

($condition ? $a : $b) = 3;

A causa della precedenza degli operatori Perl, l'istruzione viene analizzata come:

($condition ? $a = 2 : $a ) = 3 ;

Perché il ?:L'operatore produce un risultato assegnabile, 3 viene assegnato al risultato della condizione.

Quando $condizione è vera significa che $a=2=3 dà $a=3

Quando $condizione è falsa significa che $a=3 restituisce $a=3

Il modo corretto di scriverlo è

$a = $condition ? 2 : 3;

In generale, dovreste davvero eliminare l'abitudine di usare i condizionali per eseguire gli assegnamenti, come nell'esempio originale: è il genere di cose che porta Perl a guadagnarsi la reputazione di essere di sola scrittura.

Una buona regola pratica è che i condizionali sono solo per valori semplici, mai espressioni con effetti collaterali.Quando tu o qualcun altro avrete bisogno di leggere questo codice tra otto mesi, preferiresti che fosse letto così?

$x < 3 ? foo($x) : bar($y);

O così?

if ($x < 3) {
  $foo($x);
} else {
  $bar($y);
}

Un suggerimento alla risposta di Tithonium sopra:

Se desideri assegnare valori diversi alla stessa variabile, questo potrebbe essere migliore (il metodo del quaderno):

$a = ($condizione) ?2:3;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top