我想执行一些复杂的@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
在列表上下文中进行评估。如果为真(即非空),则返回。- 如果不是,
@c
也将在列表上下文中进行评估并返回。
显然,我的倒数第二个陈述是错误的。为什么?而且,更重要的是,文档或来源的哪一部分解释了这种行为?
PS:在问题的范围之外,我避免使用三元运算符的文档建议的原因是 my@b
实际上是一个临时的(函数调用结果)。