覆盖运算符优先级

时间:2015-03-22 03:33:43

标签: perl

我对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?

1 个答案:

答案 0 :(得分:2)

来自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。