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

pet*_*ete 0 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} } );
}
Run Code Online (Sandbox Code Playgroud)

基本模式似乎是:

$subsort = ( sub{keyComparison || defaultComparison} );
Run Code Online (Sandbox Code Playgroud)

$subsort 稍后以这种方式被调用:

foreach (sort $subsort @dataArray) {
    my $data = $_;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我在这里不了解Short-Circuit OR运算符的用法。
在什么情况下(如果有)将由?$subsort定义defaultComparison

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

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

# versus

$subsort = sub{keyComparison || defaultComparison};
Run Code Online (Sandbox Code Playgroud)

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

ike*_*ami 5

我相信你在问

$a->{key3} <=> $b->{key3} || $a->{defaultKey} <=> $b->{defaultKey}
Run Code Online (Sandbox Code Playgroud)

如有任何疑问,请解析为

( $a->{key3} <=> $b->{key3} ) || ( $a->{defaultKey} <=> $b->{defaultKey} )
Run Code Online (Sandbox Code Playgroud)

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

什么时候$a->{key3} <=> $b->{key3}返回假?

<=> 评估为

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

这意味着$a->{key3} <=> $b->{key3}评估为

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

在这三个值中,只有0false。这是唯一一次||将评估RHS的时间。

这意味着$a->{key3} <=> $b->{key3} || $a->{defaultKey} <=> $b->{defaultKey}评估为

  • -1如果 $a->{key3} < $b->{key3}
  • -1如果 $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

+------------+------------+
| key3       | defaultKey |
+------------+------------+
|          1 |          1 |
|          1 |          2 |
|          1 |          3 |
|          2 |          1 |
|          2 |          2 |
|          2 |          3 |
|          3 |          1 |
|          3 |          2 |
|          3 |          3 |
+------------+------------+
Run Code Online (Sandbox Code Playgroud)