在什么情况下,该“短路或”运算符将返回此排序函数的第二个定义?

时间:2019-04-25 20:24:18

标签: perl

我目前负责维护Perl代码库,并且遇到了如下所示的代码块:

if ($sorttype == 2) {
    $subsort = ( sub { $a->{key2} <=> $b->{key2} } );
}
elsif ($sorttype == 3) {
    $subsort = ( sub { $a->{key3} <=> $b->{key3} || $a->{defaultKey} <=> $b->{defaultKey} } );
}
elsif ($sorttype == 4) {
    $subsort = ( sub { $b->{defaultKey} <=> $a->{defaultKey} } );
}
elsif ($sorttype == 5) {
    $subsort = ( sub { $b->{key5} cmp $a->{key5} || $a->{defaultKey} <=> $b->{defaultKey} } );
}

基本模式如下:

$subsort = ( sub{keyComparison || defaultComparison} );
稍后以这种方式调用

$subsort

foreach (sort $subsort @dataArray) {
    my $data = $_;
    ...
}

我在这里不了解Short-Circuit OR运算符的使用。
在什么可能的情况下,$subsort会由defaultComparison定义吗?

作为附带的问题,是否有必要将其包装在列表上下文中(例如,放在括号中)?
我的意思是:

$subsort = ( sub{keyComparison || defaultComparison} );

# versus

$subsort = sub{keyComparison || defaultComparison};

注意:
如果有人能想到这个问题的更好的标题,请对其进行编辑(我怀疑如果我能想到一个更好的标题,那么我的google-fu不会让我失望)。

1 个答案:

答案 0 :(得分:5)

我相信您正在询问

gcc

如果有任何疑问,将其解析为

$a->{key3} <=> $b->{key3} || $a->{defaultKey} <=> $b->{defaultKey}

由于( $a->{key3} <=> $b->{key3} ) || ( $a->{defaultKey} <=> $b->{defaultKey} ) 短路,仅当其LHS(||)返回false时,才会评估其RHS($a->{defaultKey} <=> $b->{defaultKey})。因此,您的问题可以归结为以下内容:

  

$a->{key3} <=> $b->{key3}何时返回假?

$a->{key3} <=> $b->{key3}的计算结果

  • -1,如果其LHS数值小于其RHS。
  • 如果LHS的数值等于其RHS,则为0。
  • +1,如果其LHS在数值上大于其RHS。

这意味着<=>的计算结果

  • -1,如果$a->{key3} <=> $b->{key3}
  • 如果$a->{key3} < $b->{key3}
  • 为0
  • 如果$a->{key3} == $b->{key3}
  • 为+1

在这三个值中,只有$a->{key3} > $b->{key3}为假。这是唯一一次评估0的RHS的情况。

这意味着||的计算结果

  • -1,如果$a->{key3} <=> $b->{key3} || $a->{defaultKey} <=> $b->{defaultKey}
  • -1,如果$a->{key3} < $b->{key3}
  • 如果$a->{key3} == $b->{key3} && $a->{defaultKey} < $b->{defaultKey}
  • 为0
  • 如果$a->{key3} == $b->{key3} && $a->{defaultKey} == $b->{defaultKey}
  • 为+1
  • 如果$a->{key3} == $b->{key3} && $a->{defaultKey} > $b->{defaultKey}
  • 为+1

当用作$a->{key3} > $b->{key3}比较功能时,它将使项目按sort进行排序,并以key3断开联系。

defaultKey