Alain: was bedeutet <=> ?

Hallo guten abend,
ich habe keinen schimmer was <=> bedeutet.
Perl gibt einen fehler aus bei dieser sub ausgabe
sub number { $a <=> $b }
die fehler log schreibt
Argument "" isn't numeric in numeric comparison (<=>) at smart.cgi line
aber ohne diesen sub geht mein shop nicht mehr oder nicht mehr richtig.
weiss jemand Rat?
Grüsse
vom Alain

  1. Hallo Alain,

    ich habe keinen schimmer was <=> bedeutet.

    <=> ist der numerische Vergleichsoperator mit vorzeichenbehaftetem Ergebnis.
    Das Pendant für Strings wäre cmp.

    <=> bzw. cmp liefern  -1 zurück, wenn der linke Operand kleiner als der rechte ist, 0 bei Gleichheit, +1, wenn der linke Operand größer ist als der rechte.

    Perl gibt einen fehler aus bei dieser sub ausgabe
    sub number { $a <=> $b }
    die fehler log schreibt
    Argument "" isn't numeric in numeric comparison (<=>) at smart.cgi line

    Mit einem numerischen Vergleich kannst Du in Perl keine Zeichenketten vergleichen, nur numerische Werte. Find' ich gut.

    Freundliche Grüsse,

    Vinzenz

    1. hallo Vinzenz,

      <=> ist der numerische Vergleichsoperator mit vorzeichenbehaftetem Ergebnis.
      Das Pendant für Strings wäre cmp.

      wow, ich dachte bisher, daß ich http://de.selfhtml.org/cgiperl/sprache/operatoren.htm für Version 8.1 unverändert lassen könnte. Es scheint so, als müßte die Liste der dort verzeichneten Operatoren doch noch erweitert werden.

      Mit einem numerischen Vergleich kannst Du in Perl keine Zeichenketten vergleichen, nur numerische Werte. Find' ich gut.

      Ich auch ;-) Alain ist uns aber die Erläuterung schuldig geblieben, was gerade in $a und $b drinsteht.

      Grüße aus Berlin

      Christoph S.

      1. Hi,

        Alain ist uns aber die Erläuterung schuldig geblieben, was gerade in $a und $b drinsteht.

        die Elemente der zu sortierenden Liste, siehe perldoc -f sort.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. morgens Cheatah,

          die Elemente der zu sortierenden Liste, siehe perldoc -f sort.

          grrrrrrr ...
          klar doch ;-) Aber was ist, wenn er nun gar keine Liste hat? "Man weiß es ja nicht so genau" würde Stafan Raab sagen. Und du kennst sein Script auch nicht besser als ich.

          Grüße aus Berlin

          Christoph S.

      2. Hallo Christoph,

        Da fehlen noch ein paar andere Operatoren: !~ -> \ ...
        Siehe auch perldoc perlop

        Grüße

        Daniel

        1. hi,

          Da fehlen noch ein paar andere Operatoren: !~ -> \ ...
          Siehe auch perldoc perlop

          <sufz>
          Ja, inzwischen hab ich das nachgesehen. Menno, man bekommt ja hier immer mal wieder völlig unerwartet nen <I> übergeholfen, grmpf
          </seufz>

          Grüße aus Berlin

          Christoph S.

      3. hallo Christoph S. un Vincent,

        <=> ist der numerische Vergleichsoperator mit vorzeichenbehaftetem Ergebnis.
        Das Pendant für Strings wäre cmp.

        cmp?Gibts denn eine altenative zu <=> operator?

        wow, ich dachte bisher, daß ich http://de.selfhtml.org/cgiperl/sprache/operatoren.htm für Version 8.1 unverändert lassen könnte. Es scheint so, als müßte die Liste der dort verzeichneten Operatoren doch noch erweitert werden.

        wäre eine idee :)

        Mit einem numerischen Vergleich kannst Du in Perl keine Zeichenketten vergleichen, nur numerische Werte. Find' ich gut.

        aber wie erkärst Du Dir das,dass der shop eigentlich einwandfrei funkioniert so,ausser eben dieser einen fehler meldung?
        Ich weiss auch nicht genau wo oder auf was $a oder $b sich bezieht,sehe
        in dem script nicht mal wo der "sub number" ausgeführt wird.
        Ich habe mal das script als text datei hochgeladen
        http://www.tramplefun.com/neu/smart.txt
        und die confdatei
        http://www.tramplefun.com/neu/smartcfg.txt

        der "sub number" ist ganz unten vom script.

        Grüsse vom
        Alain

        1. hallo Alain,

          Mit einem numerischen Vergleich kannst Du in Perl keine Zeichenketten vergleichen, nur numerische Werte. Find' ich gut.
          aber wie erkärst Du Dir das,dass der shop eigentlich einwandfrei funkioniert so,ausser eben dieser einen fehler meldung?

          Wahrscheinlich ist das keine wirkliche Fehlermeldung, sondern eine Warnung. Das heißt, dein Script beachtet _diese_ Angabe nicht, kann aber weiterarbeiten  -  aber das ist natürlich nur mal so herumgeraten, da wir ja dein Script bisher nicht kennen und du auch keinen exakten log-Auszug gepostet hast.

          Grüße aus Berlin

          Christoph S.

        2. Привет Alain.

          Sag mal, ist das deine Lebensaufgabe, antiquierte Scripte zum fehlerfreien Laufen zu bringen? ;-)

          Ich weiss auch nicht genau wo oder auf was $a oder $b sich bezieht

          Wie Vinzenz schrieb, auf die zwei nebeneinander liegenden Werte, $a ist dabei der aktuelle, $b der folgende Wert (siehe Perldoc: sort).

          http://www.tramplefun.com/neu/smart.txt

          Dort wird ein Hash %shipping nach seinen Schlüsseln aufsteigend sortiert und das Ergebnis in den Array @prices geschrieben:

          @prices = sort number keys %shipping;

          number ist dabei die Referenz auf eine Sortierfunktion, man könnte auch gleich schreiben:

          @prices = sort {$a <=> $b} keys %shipping;

          http://www.tramplefun.com/neu/smartcfg.txt

          Und da ist der Übeltäter, nämlich dieser ominöse Hash (siehe auch perldata):

          %shipping = ("",'0.00','1','5.00','3','10.00','5','15.00','7','20.00','10','30.00');

          Du siehst, alles Strings, ergo muss bei Verwendung von '<=>' ein Fehler kommen. Warum der Shop trotzdem funktioniert, musst du jetzt aber selber recherchieren :)

          Дружба!
          Siechfred

          --
          Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
          1. Hallo Siechfred,

            Wie Vinzenz schrieb, auf die zwei nebeneinander liegenden Werte, $a ist dabei der aktuelle, $b der folgende Wert

            Perl wird kaum einen Sortieralgorithmus verwenden, der nur nebeneinander liegende Werte vergleicht, da ein solcher in O(n²) liegt.

            Grüße

            Daniel

            1. Привет Daniel.

              Perl wird kaum einen Sortieralgorithmus verwenden, der nur nebeneinander liegende Werte vergleicht, da ein solcher in O(n²) liegt.

              *argh*
              Du weißt sicher trotz meines amateuerhaften Beschreibungsversuches, wie ich es gemeint habe.

              Дружба!
              Siechfred

              --
              Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
          2. hallo Siechfred,

            Привет Alain.

            »»

            lernst Du russisch :)

            Sag mal, ist das deine Lebensaufgabe, antiquierte Scripte zum fehlerfreien Laufen zu bringen? ;-)

            naja sagen wir mal so,ich interessiere mich eben noch für alte
            (gibt ja keine vernüftigen neue->oder aber ich habe tomaten auf den augen)
            scripts und halt eben perl :)

            Wie Vinzenz schrieb, auf die zwei nebeneinander liegenden Werte, $a ist dabei der aktuelle, $b der folgende Wert (siehe Perldoc: sort).

            ja hab mir mal angesehen,brachte aber nicht viel jedenfalls nicht mit {$a <=> $b}

            Dort wird ein Hash %shipping nach seinen Schlüsseln aufsteigend sortiert und das Ergebnis in den Array @prices geschrieben:

            aha

            @prices = sort number keys %shipping;

            number ist dabei die Referenz auf eine Sortierfunktion, man könnte auch gleich schreiben:

            @prices = sort {$a <=> $b} keys %shipping;

            hmmm,das dacht ich mir,aber die sub kann doch nicht nur mit "number" aufgerufen werden?

            Und da ist der Übeltäter, nämlich dieser ominöse Hash (siehe auch perldata):

            %shipping = ("",'0.00','1','5.00','3','10.00','5','15.00','7','20.00','10','30.00');

            nach perl doc hab ichs mal so
            my %shipping = ('0' => '0.00','1' => '5.00','3' => '10.00','5' => '15.00','7' => '20.00','10' => '30.00');
            versucht,aber kein grosser erfolg gehabt,jedoch jetzt gehts auch ohne den <=> sub was mir nun auch keinen error mehr verursacht-keine ahnung warum das jetzt so geht.
            habe den unteren teil noch so

            if (($itemquant)and($itemquant >= 1)) {
            local($low,@prices,$price);
            my $price = '5'||'';
            @prices = sort keys %shipping;
            $low = $prices[0];
            foreach $price (@prices) {
            if (($price > $low) && ($price <= $totalquant)) {$low = $price};
            }
            $shipamt = $shipping{$low};
            $totalprice += $shipamt............

            abgeändert.Komisch so geht alles ohne fehler im errorlog.

            Du siehst, alles Strings, ergo muss bei Verwendung von '<=>' ein Fehler kommen. Warum der Shop trotzdem funktioniert, musst du jetzt aber selber recherchieren :)

            ja das hab ich ,aber mit hashes hab ich da so meine probleme.
            Gut Nacht vom müden
            Alain

            1. Привет Alain.

              lernst Du russisch :)

              Nö, das habe ich 8 Jahre lang getan, nu reicht's :)

              hmmm,das dacht ich mir,aber die sub kann doch nicht nur mit "number" aufgerufen werden?

              Ja, du kannst sie theoretisch auch number("bla", "fasel", $schwaetz) aufrufen, hat aber keinen Effekt, da die sub weder Übergabewerte erwartet noch irgendwelche verarbeitet. Evtl. kommt eine Warnung oder eine Fehlermeldung, habe ich noch nicht ausprobiert. $a und $b sind übrigens globale Variablen, die im Zusammenhang mit sort() zur Verfügung stehen, da muss nichts an die Funktion übergeben werden. Naja, und eine extra Sortierfunktion brauchst du eigentlich nur für komplexe Sortieraufgaben.

              Und da ist der Übeltäter, nämlich dieser ominöse Hash (siehe auch perldata):
              %shipping = ("",'0.00','1','5.00','3','10.00','5','15.00','7','20.00','10','30.00');

              Ja, der erste Schlüssel des Hashes ist ein leerer String, also m.W. NaN, was bei Verwendung des numerischen Vergleichsoperators zwangsläufig zur Fehlermeldung führen muss (siehe perldoc sort, ganz am Ende). Aber du scheinst das Problem ja hinbekommen zu haben.

              Дружба!
              Siechfred

              --
              »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«