В perl, $x = if (0) {1} else {2}
не работает.
$ perl -E'$x = if (0) {1} else {2}'
syntax error at -e line 1, near "= if"
Execution of -e aborted due to compilation errors.
Это имеет смысл, поскольку условные выражения if
не являются выражениями в Perl. Они контролируют поток.
Но тогда
my $x = do { if (0) {1} else {2} };
Работает! Почему do BLOCK
может принять условное if
? Но назначение не может? Казалось бы, в приведенном выше примере управление потоком должно либо
- знать, что его контекст в
do BLOCK
- всегда действует как выражение, но этот синтаксис запрещен синтаксическим анализатором.
Кроме того, учитывая простые факты, приведенные выше, как правильно описать условие if, которое ведет себя так? Это выражение со значением? Является ли это конструкцией управления потоком, которая не имеет значения после оценки?
И, наконец, какие изменения необходимо внести в присвоение, чтобы оно приняло условие if
, например do BLOCK
.