我目前的任务是维护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不会让我失望)。
我相信你在问
$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}返回假?
<=> 评估为
这意味着$a->{key3} <=> $b->{key3}评估为
$a->{key3} < $b->{key3}$a->{key3} == $b->{key3}$a->{key3} > $b->{key3}在这三个值中,只有0false。这是唯一一次||将评估RHS的时间。
这意味着$a->{key3} <=> $b->{key3} || $a->{defaultKey} <=> $b->{defaultKey}评估为
$a->{key3} < $b->{key3}$a->{key3} == $b->{key3} && $a->{defaultKey} < $b->{defaultKey}$a->{key3} == $b->{key3} && $a->{defaultKey} == $b->{defaultKey}$a->{key3} == $b->{key3} && $a->{defaultKey} > $b->{defaultKey}$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)