为什么我不能分配@b || 在Perl中@c到@a?

JB.*_*JB. 12 perl grammar

我想执行一些复杂的@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
Run Code Online (Sandbox Code Playgroud)

不幸的是,它并没有真正告诉我原因.

我期望会发生的是:

  • @a = 是一个数组赋值,在右侧引入列表上下文.
  • @b || @c 是右侧,在列表上下文中进行评估.
  • ||是C型短路逻辑或.它从左到右进行评估(如果需要)并传播上下文.
  • @b在列表上下文中进行评估.如果为真(非空),则返回.
  • 如果没有,@c也在列表上下文中进行评估,并返回.

显然,我的倒数第二个陈述是错误的.为什么?更重要的是,文档或来源的哪一部分可以解释这种行为?

PS:出于问题的范围,我不遵守文档关于使用三元运算符的建议的原因是我@b实际上是临时的(函数调用结果).

Bra*_*ert 7

逻辑或运算符(" ||")在标量上下文中计算其左手参数.

这样做的原因是要弄清楚参数是否为真.布尔上下文是标量上下文的一个特例,它强制它进入标量上下文.


"C风格 - 逻辑 - 或"perldoc perlop

二进制" ||"执行短路逻辑OR运算.也就是说,如果左操作数为true,则甚至不评估右操作数....


"标量值":perldoc perldata

....布尔上下文只是一种特殊的标量上下文,不会转换为字符串或数字.


Wil*_*ell 7

在perlop中,在您引用的部分之前只有几个段落:

Binary "||" performs a short-circuit logical OR operation.  That is,
if the left operand is true, the right operand is not even evaluated.
Scalar or list context propagates down to the right operand if it is
evaluated.

这没有明确声明列表上下文不会传播到左操作数,而是perlop的顶部状态:

With very few exceptions, these all operate on scalar values
only, not array values.

因此我们可以假设传播到右操作数的列表上下文是规则的例外,并且缺少关于左操作数的上下文的任何语句意味着适用一般规则.