Из-за приоритета оператора Perl оператор анализируется как:
($condition ? $a = 2 : $a ) = 3 ;
Поскольку оператор?: Выдает назначаемый результат, 3 присваивается результату условия.
Когда $ условие истинно, это означает, что $ a = 2 = 3 дает $ a = 3
Когда $ условие ложно, это означает, что $ a = 3 дает $ a = 3
Правильный способ написать это
$a = $condition ? 2 : 3;
В общем, вы действительно должны отказаться от привычки использовать условные выражения для выполнения присваивания, как в первоначальном примере - именно из-за этого Perl получает репутацию только для записи.
Хорошее практическое правило заключается в том, что условные выражения предназначены только для простых значений, а не выражений с побочными эффектами. Если вам или кому-либо еще нужно прочитать этот код через восемь месяцев, вы бы предпочли, чтобы он читался следующим образом?
$x < 3 ? foo($x) : bar($y);
Или вот так?
if ($x < 3) {
$foo($x);
} else {
$bar($y);
}