这是一个最佳实践问题。
我只看到过数字排序例程中使用的Perl太空船运算符(< =>)。但它在其他情况下似乎很有用。我想不出实际用途。
有人能举例说明何时可以在Perl排序之外使用它?
答案 0 :(得分:7)
我正在为机器人Joe编写一个控制系统,想要去机器人玛丽并给她充电。它们沿着线上的整数点移动。 Joe从$ j开始,每个时间单位可以向任何方向行走1米。玛丽仍站在$ m,无法动弹 - 她需要充好的充电!控制程序看起来像这样:
while ($m != $j) {
$j += ($m <=> $j);
}
答案 1 :(得分:5)
<=>
运算符对binary search algorithm有用。大多数编程语言都没有进行三向比较的运算符,因此每次迭代都需要进行两次比较。使用<=>
,您只能做一个。
sub binary_search {
my $value = shift;
my $array = shift;
my $low = 0;
my $high = $#$array;
while ($low <= $high) {
my $mid = $low + int(($high - $low) / 2);
given ($array->[$mid] <=> $value) {
when (-1) { $low = $mid + 1 }
when ( 1) { $high = $mid - 1 }
when ( 0) { return $mid }
}
}
return;
}
答案 2 :(得分:2)
在任何一种比较方法中。例如,你可能有一个复杂的对象,但仍然有一个定义的“顺序”,所以你可以为它定义一个比较函数(你没有 在排序方法中使用,尽管它会方便):
package Foo;
# ... other stuff...
# Note: this is a class function, not a method
sub cmp
{
my $object1 = shift;
my $object2 = shift;
my $compare1 = sprintf("%04d%04d%04d", $object1->{field1}, $object1->{field2}, $object1->{field3});
my $compare2 = sprintf("%04d%04d%04d", $object2->{field1}, $object2->{field2}, $object2->{field3});
return $compare1 <=> $compare2;
}
这当然是一个完全人为的例子。但是,在我公司的源代码中,我发现了几乎完全相同的内容,用于比较用于保存日期和时间信息的对象。
我能想到的另一个用途是用于统计分析 - 如果对值列表重复运行一个值,您可以判断该值是高于还是低于集合的算术中位数:
use List::Util qw(sum);
# $result will be
# -1 if value is lower than the median of @setOfValues,
# 1 if value is higher than the median of @setOfValues,
# 0 if value is equal to the median
my $result = sum(map { $value <=> $_ } @setOfValues);
这里还有一个,来自wikipedia:“如果无法比较两个参数(例如其中一个是NaN),则运算符返回undef。”也就是说,你可以确定两个数字是否同时是一个数字,尽管我个人会选择不那么神秘的Scalar::Util :: Looks_like_number。