Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 太空船操作员何时在分拣机外使用?_Perl_Sorting_Operators_Spaceship Operator - Fatal编程技术网

Perl 太空船操作员何时在分拣机外使用?

Perl 太空船操作员何时在分拣机外使用?,perl,sorting,operators,spaceship-operator,Perl,Sorting,Operators,Spaceship Operator,我只见过在数字排序例程中使用的Perl spaceship操作符()。但它在其他情况下似乎很有用。我就是想不出有什么实际用途 什么时候可以在Perl排序之外使用它 这是一个最佳实践问题。在任何类型的比较方法中。例如,您可能有一个复杂的对象,但它仍然有一个已定义的“顺序”,因此您可以为它定义一个比较函数(您不必在排序方法中使用这个函数,尽管它很方便): package-Foo; # ... 其他东西。。。 #注意:这是一个类函数,不是一个方法 亚化学机械抛光 { my$object1=班次; my

我只见过在数字排序例程中使用的Perl spaceship操作符()。但它在其他情况下似乎很有用。我就是想不出有什么实际用途

什么时候可以在Perl排序之外使用它


这是一个最佳实践问题。

在任何类型的比较方法中。例如,您可能有一个复杂的对象,但它仍然有一个已定义的“顺序”,因此您可以为它定义一个比较函数(您不必在排序方法中使用这个函数,尽管它很方便):

package-Foo;
# ... 其他东西。。。
#注意:这是一个类函数,不是一个方法
亚化学机械抛光
{
my$object1=班次;
my$object2=班次;
my$compare1=sprintf(“%04d%04d%04d”、$object1->{field1}、$object1->{field2}、$object1->{field3});
my$compare2=sprintf(“%04d%04d%04d”、$object2->{field1}、$object2->{field2}、$object2->{field3});
返回$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);
use List::Util qw(sum);
#$结果将是
#-1如果值低于@setOfValues的中值,
#1如果值高于@setOfValues的中值,
#如果值等于中间值,则为0
my$result=sum(映射{$value$\}@setOfValues);

这里还有一个,来自:“如果两个参数无法比较(例如其中一个是NaN),则运算符返回undef。”,即,您可以同时确定两个数字是否为a,虽然就我个人而言,我会选择不那么神秘的::looks_like_number。

我正在为机器人乔编写一个控制系统,它想去机器人玛丽那里给她充电。它们沿直线上的整数点移动。乔的起薪是$j,每单位时间可以向任何方向走1米。玛丽站着一动不动,身价为万美元,无法动弹——她需要好好充电!控制程序如下所示:

while ($m != $j) {
    $j += ($m <=> $j);
}
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;
}
子二进制搜索{
我的$value=shift;
我的$array=shift;
我的$low=0;
my$high=$#$数组;
而($low[$mid]$value){
当(-1){$low=$mid+1}
当(1){$high=$mid-1}
当(0){return$mid}
}
}
返回;
}

实际上,
undef
行为可能会导致问题,因为
undef
在某种程度上很可能会导致Perl死亡。但是我们可以做一个处理NaN的数字排序:
次数字{$a$b/($a==$a)-($b=$b)}
这将对NaN进行一开始的排序,至少不会死亡。考虑到正确实现二进制搜索是多么的困难,我只能希望我没有为世界贡献另一个失败的例子p将这两个比较从显式编写的语句委托给预处理器内部的性能优势是什么?在字节码级别有一个运算符,而不是两个:
perl-MO=Terse-e“$a$b”
,因为perl是用C实现的(C没有三向比较运算符)
必须由内部实现为两个比较。任何性能上的好处都是在C而不是Perl中进行扩展。当然,最终的限制是处理器的指令集支持什么,而不管C有什么运算符。@ether:只有“operator”标记?我以为你喜欢创建新的操作员标签!
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;
}