I have this piece of script :
#!/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);
I don't have any problems under Windows XP / Strawberry Perl 5.10.1
either Linux 2.6.12-1 i386 / Perl v5.8.5 built for i386-linux-thread-multi,
but under Linux 2.6.18-53 / Perl v5.8.8 built for x86_64-linux-thread-multi, i got the error message :
Sort subroutine didn't return a numeric value at testsort.pl line 21.
What's going wrong and how can i fix it ?
In some builds, 'nan' is coerced to the number 0 for a <=>
comparison and the sort succeeds. In other builds, nan
is treated as "not a number" and the return value from <=>
is undefined.
For maximum portability, test a value for whether it is a good number of not:
(isnan
subroutine from How do I create or test for NaN or infinity in Perl?):
sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
@arr = sort { isnan($a->{value}) ? 0 : $a->{value}
<=>
isnan($b->{value}) ? 0 : $b->{value} } @arr;
mobrule's solution:
sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
@arr = sort { isnan($a->{value}) ? 0 : $a->{value}
<=>
isnan($b->{value}) ? 0 : $b->{value} } @arr;
Perldoc's solution:
@result = sort { $a <=> $b } grep { $_ == $_ } @input;
NaN
a 0
value, which should push it to the top of the list.NaN != NaN
, to eliminate any NaN
s from the input list.As mobrule stated, this is caused by the comparison of NaN
between builds.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With