7 Stimmen

Seltsames Verhalten einer Art

Ich habe dieses Stück Skript:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @arr = (
    {
        name  => 'foo',
        value => 123,
    },
    {
        name  => 'bar',
        value => 'nan',
    },
    {
        name  => 'foobar',
        value => 456,
    },
);

@arr = sort {$a->{value} <=> $b->{value} } @arr;

print Dumper(\@arr);

Ich habe keine Probleme unter Windows XP / Strawberry Perl 5.10.1

entweder Linux 2.6.12-1 i386 / Perl v5.8.5 gebaut für i386-linux-thread-multi,

aber unter Linux 2.6.18-53 / Perl v5.8.8 gebaut für x86_64-linux-thread-multi, bekam ich die Fehlermeldung :

Sort subroutine didn't return a numeric value at testsort.pl line 21.

Was läuft schief und wie kann ich es beheben?

6voto

mob Punkte 113680

In einigen Builds wird 'nan' zu der Zahl 0 für eine <=> Vergleich und die Sortierung ist erfolgreich. In anderen Builds, nan wird als "keine Zahl" behandelt und der Rückgabewert von <=> ist undefiniert.

Um eine maximale Übertragbarkeit zu gewährleisten, sollten Sie einen Wert daraufhin prüfen, ob er eine gute Zahl ist oder nicht:

( isnan Unterroutine aus Wie kann ich in Perl NaN oder Unendlichkeit erzeugen oder testen? ) :

sub isnan { ! defined( $_[0] <=> 9**9**9 ) }

@arr = sort { isnan($a->{value}) ? 0 : $a->{value}
                         <=>  
              isnan($b->{value}) ? 0 : $b->{value} }  @arr;

4voto

vol7ron Punkte 38053

2 Lösungen

  1. mobrule die Lösung:

    sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
    @arr = sort { isnan($a->{value}) ? 0 : $a->{value}
                                  <=>  
                  isnan($b->{value}) ? 0 : $b->{value} }  @arr;
  2. Perldoc die Lösung:

    @result = sort { $a <=> $b } grep { $_ == $_ } @input;

  1. Gibt Ihr NaN a 0 Wert, der ihn an den Anfang der Liste bringen sollte.
  2. Nutzt den Vorteil, dass NaN != NaN zur Beseitigung etwaiger NaN s aus der Eingabeliste.

Comme mobrule wird dies durch den Vergleich von NaN zwischen den Builds.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X