Frage

Dies ist eine bewährte Methode Frage.

habe ich nur den Perl-Raumschiff Operator gesehen (<=>) in numerischer Sortierung Routinen verwendet. Aber es scheint, in anderen Situationen nützlich. Ich kann einfach nicht glauben, von einer praktischen Anwendung.

Kann jemand geben Sie mir ein Beispiel, wenn es eine Art gebrauchte außerhalb eines Perl sein könnte?

War es hilfreich?

Lösung

Ich bin ein Steuersystem für Roboter Joe Schreiben, die Roboter Mary gehen will und laden sie. Sie bewegen sich entlang der ganzzahligen Punkte auf der Linie. Joe beginnt $ j an und 1 Meter in jede Richtung pro Zeiteinheit laufen kann. Maria steht immer noch bei $ m und kann sich nicht bewegen - sie eine gute aufladen muss! Das Steuerprogramm würde so aussehen:

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

Andere Tipps

Der <=> Operator wäre nützlich für einen binären Suchalgorithmus . Die meisten Programmiersprachen haben keinen Operator, der einen Drei-Wege-Vergleich macht, die es notwendig macht pro Iteration zwei Vergleiche zu tun. Mit <=> können Sie tun, nur eine.

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 jeder Art von Vergleichsverfahren. Zum Beispiel könnten Sie eine komplizierte Aufgabe haben, aber immer noch eine definierte „Ordnung“, so dass Sie eine Vergleichsfunktion für sie definieren könnten (was man nicht Haben in einer Sortiermethode zu verwenden, obwohl es wäre handlich sein):

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

Dies ist ein völlig erfundenes Beispiel natürlich. Doch in Sourcecode meiner Firma fand ich fast genau die oben, für Objekte, die zum Halten von Datum und Uhrzeit zu vergleichen.

Eine andere Verwendung ich denken kann für die statistische Analyse ist - wenn ein Wert wiederholt gegen eine Liste von Werten ausgeführt wird, können Sie feststellen, ob der Wert höher oder niedriger ist als der arithmetische Median des Satzes:

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

Hier ist eine weitere, von wikipedia : „Wenn die beiden Argumente nicht verglichen werden können (zB einer von ihnen ist NaN), der Operator kehrt undef.“ dh Sie können bestimmen, ob zwei Zahlen aa Zahl auf einmal, obwohl ich persönlich für die weniger kryptischen Scalar :: Util :: looks_like_number.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top