Prima di tutto, "che non ha funzionato neanche" Non è la cosa più utile potresti dircelo. È importante sapere esattamente in che modo non ha funzionato: cosa ha fatto, cosa ti aspetti e come differiscono?
Ma il problema con
defined($model->test) ? $review="1" : $review='';
è precedenza degli operatori. L'operatore condizionale ? :
lega più saldamente di quanto l'operatore di assegnazione =
, in modo che il sopra è equivalente a:
(defined($model->test) ? $review="1" : $review) = '';
Quindi, se $model->test
è definito, lo fa l'equivalente di
$review = "1" = '';
È possibile risolvere questo problema con parentesi:
defined($model->test) ? ($review="1") : ($review='');
Ma davvero, perché vorresti? L'operatore condizionale (ternario) è utile quando si desidera utilizzare il risultato.Se il risultato sta per essere scartato, in quanto è qui, è più chiaro (e, come avete visto, meno soggetto a errori) per utilizzare un if/else:
if (defined($model->test) {
$review = "1";
}
else {
$review = "";
}
o, se insistete sulla scrittura su una sola riga:
if (defined($model->test) { $review = "1"; } else { $review = ""; }
Se davvero si vuole usare un'espressione condizionale, si può fare questo:
$review = defined($model->test) ? "1" : "";
che è probabilmente un modo ragionevole per farlo.
BUT:
L'operatore defined
stessa cede o "1"
(true) o ""
(false). quindi il tutto può essere ridotto a:
$review = defined($model->test);
Si dovrebbe davvero impostarlo a '1' non' '' '. Entrambi hanno la stessa rappresentazione di stringa (''''). L'unica differenza è che '''' avviserà se si tenta di usarlo come un numero, dove come '! 1' non lo farà. (Supponendo che tu abbia sempre "usato avvertenze;" all'inizio di ogni parte del codice Perl come dovresti.) –