Domanda

Questa è una domanda migliore pratica.

ho visto solo l'operatore Perl navicella spaziale (<=>) utilizzato nella routine di ordinamento numerici. Ma sembra utile in altre situazioni. Non riesco a pensare a un uso pratico.

Qualcuno mi può dare un esempio di quando potrebbe essere utilizzato al di fuori di un Perl sorta?

È stato utile?

Soluzione

Sto scrivendo un sistema di controllo per robot Joe che vuole andare al robot Maria e la sua ricarica. Si muovono lungo i punti interi sulla linea. Joe comincia a $ j e può camminare 1 metro in qualsiasi direzione per unità di tempo. Mary si trova ancora a $ m e non può muoversi - ha bisogno di una buona ricarica! Il programma di controllo sarà simile che:

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

Altri suggerimenti

L'operatore <=> sarebbe utile per un binario algoritmo di ricerca . La maggior parte dei linguaggi di programmazione non hanno un operatore che fa un confronto a tre vie, che rende necessario fare due confronti per ogni iterazione. Con <=> si può fare solo una.

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

In ogni tipo di metodo di confronto. Ad esempio si potrebbe avere un oggetto complicata ma ha ancora un "ordine" definito, quindi si può definire una funzione di comparazione per esso (non fare è da utilizzare all'interno di un metodo di ordinamento, anche se sarebbe essere a portata di mano):

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

Questo è un esempio del tutto artificiosa, naturalmente. Tuttavia, nel codice sorgente della mia azienda ho trovato quasi esattamente quanto sopra, per confrontare gli oggetti utilizzati per lo svolgimento di data e ora.

Un altro uso che posso pensare è per l'analisi statistica - se un valore non è più volte eseguito con un elenco di valori, si può dire se il valore è superiore o inferiore mediana aritmetica del set:

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

Ecco un altro, da Wikipedia : "Se i due argomenti non possono essere confrontati (ad esempio, uno di loro è NaN), l'operatore restituisce undef." cioè è possibile determinare se due numeri sono aa numero in una sola volta, anche se personalmente mi piacerebbe andare per i meno criptico Scalar :: Util :: looks_like_number.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top