У меня есть эта часть сценария:
#!/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);
У меня нет проблем под Windows XP / Земляничный Perl 5.10.1
любой Linux 2.6.12-1 i386 / Perl v5.8.5, созданный для i386-linux-thread-multi,
но в соответствии с Linux 2.6.18-53 / Perl v5.8.8 создал для x86_64-linux-thread-multi, я получил сообщение об ошибке:
Sort subroutine didn't return a numeric value at testsort.pl line 21.
Что идет не так, как надо и как я могу зафиксировать его?
В некоторых сборках для сравнения <=>
'nan' принудительно приводится к числу 0, и сортировка проходит успешно. В других сборках nan
рассматривается как "не число", и возвращаемое значение <=>
не определено.
Для максимальной переносимости проверяйте значение на то, является ли оно хорошим числом или нет:
(isnan
подпрограмма из Как создать или проверить NaN или бесконечность в Perl?):
sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
@arr = sort { isnan($a->{value}) ? 0 : $a->{value}
<=>
isnan($b->{value}) ? 0 : $b->{value} } @arr;
sub isnan {! определено ($ _ [0] <=> 9 ** 9 ** 9)}
@arr = sort {isnan ($ a -> {value})? 0: $ a -> {значение}
<=>
isnan ($ b -> {значение})? 0: $ b -> {значение}} @arr;
@result = sort {$ a <=> $ b} grep {$ _ == $ _} @input;
NaN
значение 0
, которое должно перемещать его в начало списка. NaN! = NaN
, чтобы исключить любые NaN
из входного списка. Как сказано в mobrule , это вызвано сравнением NaN
между сборками.