Я хотел бы выполнить некоторую запутанную вариацию назначения @a = @b || @c
с намерением взять @b
, если не пуст (отсюда и истина в булевом смысле), @c
в противном случае. Документация прямо говорит мне, что я не могу. (И это правда об этом тоже!)
"||", "//" и "& &" операторы возвращают последнее оцениваемое значение (в отличие от C "||" и "& &", которые возвращают 0 или 1).
[...]
В частности, это означает, что вы не должны использовать это для выбора между двумя агрегатами для назначения:
@a = @b || @c; # this is wrong @a = scalar(@b) || @c; # really meant this @a = @b ? @b : @c; # this works fine, though
К сожалению, на самом деле это не говорит мне почему.
Я ожидал, что это произойдет:
-
@a =
- это назначение массива, вызывающее контекст списка с правой стороны. -
@b || @c
- это правая сторона, которая должна быть оценена в контексте списка. -
||
- логический или короткозамкнутый C-стиль. Он оценивает слева направо (при необходимости) и распространяет контекст. -
@b
оценивается в контексте списка. Если true (т.е. Не пусто), он возвращается. - if not,
@c
также оценивается в контексте списка и возвращается.
Очевидно, что мое предпоследнее утверждение неверно. Зачем? И, что еще более важно, какая часть документации или источников объясняет это поведение?
PS: из области вопроса причина, по которой я воздерживаюсь от предложения по документации использования тернарного оператора, заключается в том, что мой @b
фактически является временным (результат вызова функции).