代码之家  ›  专栏  ›  技术社区  ›  Toto

奇怪的行为

  •  7
  • Toto  · 技术社区  · 15 年前

    我有一个剧本:

    #!/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);
    

    我在WindowsXP/Perl5.10.1下没有任何问题

    为i386 Linux多线程构建的Linux 2.6.12-1 i386/Perl v5.8.5,

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

    出了什么问题,我该怎么解决?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Community Mohan Dere    8 年前

    在某些生成中,对于一个 <=> 比较和排序成功。在其他版本中, nan 被视为“不是数字”并且 < 未定义。

    ( isnan 子例程来自 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;
    
        2
  •  4
  •   Community Mohan Dere    5 年前

    2解决方案

    1. mobrule 的解决方案:

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

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

    1. 给你的 NaN 0
    2. NaN != NaN

    作为 暴民统治 说明,这是由于 在构建之间。