Pregunta

Esta es una mejor pregunta práctica.

Sólo he visto el operador de Perl nave espacial (<=>) que se utiliza en las rutinas de ordenación numérica. Pero parece ser útil en otras situaciones. No puedo pensar en un uso práctico.

Puede alguien darme un ejemplo de cuando podría ser utilizado fuera de una especie de Perl?

¿Fue útil?

Solución

Estoy escribiendo un sistema de control para el robot a Joe que quiere ir al robot de María y recargar ella. Se mueven a lo largo de los puntos enteros en la línea. Joe comienza en $ j y puede caminar 1 metro de cualquier dirección por unidad de tiempo. María se detiene en $ m y no puede moverse - que necesita una buena recarga! El programa de control se vería así:

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

Otros consejos

El operador <=> sería útil para un binaria algoritmo de búsqueda . La mayoría de los lenguajes de programación no tienen un operador que hace una comparación de tres vías que hace necesario hacer dos comparaciones por iteración. Con <=> se puede hacer una sola.

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

En cualquier tipo de método de comparación. Por ejemplo, podría tener un objeto complicado, pero todavía tiene un "orden" se define, por lo que se podría definir una función de comparación para ello (que no lo hace Tienes para utilizar dentro de un método para ordenar, a pesar de que lo haría 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 es un ejemplo totalmente artificial por supuesto. Sin embargo, en el código fuente de mi empresa me encontré casi exactamente lo anterior, para comparar los objetos que se utilizan para la celebración de la fecha y hora de la información.

Otro uso que se me ocurre es para el análisis estadístico - si un valor se ejecuta repetidamente contra una lista de valores, se puede saber si el valor es mayor o menor que la mediana aritmética del conjunto:

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

Aquí hay uno más, desde Wikipedia : "Si los dos argumentos no pueden ser comparados (por ejemplo, uno de ellos es NaN), el operador devuelve undef ". es decir, se puede determinar si dos números son el número de AA a la vez, aunque personalmente me gustaría ir para los menos críptica Scalar :: Util :: looks_like_number.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top