Pergunta

Essa é uma prática recomendada questão.

Eu só vi o Perl nave espacial operador (<= > ), utilizado na classificação numérica rotinas.Mas parece útil em outras situações.Eu só consigo pensar em um uso prático.

Alguém pode me dar um exemplo de quando isso poderia ser usado fora de um Perl de classificação?

Foi útil?

Solução

Estou escrevendo um sistema de controle para o robô Joe que quer ir a Robot Mary e recarregá -la. Eles se movem ao longo dos pontos inteiros na linha. Joe começa a $ J e pode andar 1 metro em qualquer direção por unidade de tempo. Mary fica parada a $ m e não pode se mover - ela precisa de uma boa recarga! O programa de controle seria assim:

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

Outras dicas

o <=> operador seria útil para um Algoritmo de pesquisa binária. A maioria dos idiomas de programação não possui um operador que faça uma comparação de três vias, o que torna necessário fazer duas comparações por iteração. Com <=> Você pode fazer apenas um.

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

Em qualquer tipo de método de comparação.Por exemplo, você poderia ter complicado o objeto, mas ainda tem um definido "ordem", assim pode-se definir uma função de comparação para ele (que você não tem para usar dentro de um método de classificação, apesar de ser útil):

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

Este é um totalmente artificial exemplo claro.No entanto, na minha empresa sourcecode descobri que quase exatamente o acima, para a comparação de objetos usados para manter informações de data e hora.

Um outro uso que posso pensar é para a análise estatística -- se um valor é executar repetidamente contra uma lista de valores, você pode dizer se o valor é maior ou menor do que o conjunto de aritmética mediana:

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

Aqui está mais uma, a partir de taxas:"Se os dois argumentos não podem ser comparados (por exemplo,um deles é o NaN), o operador retorna undef." i.é.você pode determinar se dois números são de um número de uma só vez, embora, pessoalmente, gostaria de ir para o menos críptico Escalar::Util::looks_like_number.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top