Странное поведение вида

У меня есть эта часть сценария:

#!/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.

Что идет не так, как надо и как я могу зафиксировать его?

7
задан Toto 9 July 2010 в 14:00
поделиться

2 ответа

В некоторых сборках для сравнения <=> '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;
6
ответ дан 7 December 2019 в 01:15
поделиться

2 Решения

  1. Решение mobrule :

     sub isnan {! определено ($ _ [0] <=> 9 ** 9 ** 9)}
    @arr = sort {isnan ($ a -> {value})? 0: $ a -> {значение}
     <=>
    isnan ($ b -> {значение})? 0: $ b -> {значение}} @arr;
    
  2. Решение Perldoc :

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

  1. Дает вашему NaN значение 0 , которое должно перемещать его в начало списка.
  2. Использует то, что NaN! = NaN , чтобы исключить любые NaN из входного списка.

Как сказано в mobrule , это вызвано сравнением NaN между сборками.

4
ответ дан 7 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: