我对Perl中的运算符优先级感到困惑。我有这样的表达:
$a || $b ? join ",", @$b : ""
我以为Perl会创建一个列表上下文:
my $result = $a || ($b ? join ",", @$b : "");
# I thought (...) would create a list context and make result = 1,
# but $result is correctly set to the join of @$b
# Why does it not create list context?
来自perldoc perldata
:中关于上下文的部分
赋值有点特殊,因为它使用左参数来确定右参数的上下文对标量的赋值计算标量上下文中的右手边,而对数组或哈希的赋值计算列表上下文中的左手边。对列表(或切片,无论如何它只是一个列表)的赋值也会计算列表上下文中的右侧。
(增加重点)
和来自perldoc perlop
:
条件运算符
[…]
标量或列表上下文向下传播到第二个或第三个参数中,以选定的为准。
$a = $ok ? $b : $c; # get a scalar @a = $ok ? @b : @c; # get an array $a = $ok ? @b : @c; # oops, that's just a count!
关于优先级,||
的优先级高于条件运算符,因此
my $result = $foo || $bar ? 0 : 1;
相当于
my $result = ($foo || $bar) ? 0 : 1;
请注意,括号不会创建列表上下文,这是一个常见的误解。在这种情况下,它们不是必需的,但它们确实提高了可读性,所以我建议使用它们。
同样,在中
my $result = $foo || ($bar ? 0 : 1);
括号不会创建列表上下文。带||
如果对标量或列表上下文求值,则它向下传播到右侧操作数。
因此($bar ? 0 : 1)
是在标量上下文中评估的(假设$foo
是真值;否则,||
短路,RHS根本不评估)。