这是一个最佳实践的问题。

我只看到Perl的飞船操作者(<=>)在数字排序例程使用。但似乎在其他情况下非常有用。我不能想到一个实际使用的。

谁能给我何时能一个Perl类的外部使用的例子吗?

有帮助吗?

解决方案

我写的机器人乔说想去机器人玛丽和她的充电控制系统。他们沿着线路上的整数点移动。乔开始在$ j和在单位时间内的任何方向走1米。玛丽静止在$ m和无法移动 - 她需要一个很好的充值!该控制方案将看起来像:

while ($m != $j) {
    $j += ($m <=> $j);
}

其他提示

<=>操作者将是一个二进制搜索算法有用。大多数编程语言都没有的运营商,做了三路比较这使得有必要做每次迭代两个比较。随着<=>你可以做只有一个。

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;
}

在任何种类的比较方法的。例如,你可以有一个复杂的对象,但仍具有规定的“命令”,因此可以定义一个比较功能,用于它(这不这样做的到一种方法内使用,虽然它会很方便):

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);

下面是一个多,从维基:“如果两个参数所不能比拟的(例如其中之一是NaN),操作员返回undef“。也就是说,你可以决定是否两个数字是一次AA号码,虽然我个人会去的少神秘的标量::的Util :: looks_like_number。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top