我目前负责维护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不会让我失望)。
答案 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}
的计算结果
这意味着<=>
的计算结果
$a->{key3} <=> $b->{key3}
$a->{key3} < $b->{key3}
$a->{key3} == $b->{key3}
在这三个值中,只有$a->{key3} > $b->{key3}
为假。这是唯一一次评估0
的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