Поскольку крайний левый операнд ?:
, ||
или &&
- или этот вновь обвязанный //
thingie - всегда оценивается в логическом контексте, а не в списке, тогда как другие операнды наследуют окружающий контекст.
@a = @b && @c;
означает
if (@b) {
@a = @c;
} else {
@a = scalar @b;
}
В то время как
@a = @b || @c;
, а также
@a = @b // @c;
оба означают
означает * * тысячу двадцать-один
if (@b) {
@a = scalar @b;
} else {
@a = @c;
}
Единственный способ избавиться от scalar
при назначении @b
на @a
- это использовать ?:
@a = @b ? @b : @c;
что, конечно, означает
if (@b) {
@a = @b;
} else {
@a = @c;
}
Существует также свойство, которое ?:
может быть lvalue:
(@a > @b ? @a : @b) = @c;
что, конечно, означает
if (@a > @b) {
@a = @c;
} else {
@b = @c;
}
EDIT
Реализация @a // @b
и ее определение отличаются. Ошибка отправлена. Спасибо.