我对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?
答案 0 :(得分:2)
来自perldoc perldata
中的背景部分:
赋值有点特别之处在于它使用其左参数来确定右参数的上下文。 对标量的赋值评估标量上下文中的右侧,而对数组或散列的赋值则评估列表上下文中的右侧。分配给列表(或切片,无论如何只是一个列表)也会评估列表上下文中的右侧。
(强调补充)
条件运算符
[...]
标量或列表上下文向下传播到第二个或第三个参数,无论选择哪个。
$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。