代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

如何在Perl中对数字排序?

  •  24
  • Aakash Goel  · 技术社区  · 15 年前
    print "@_\n";
    4109 4121 6823 12967 12971 14003 20186
    

    如何用Perl对其进行排序?

    使用 @sorted = sort(@_); 按字母顺序给我排序

    13041 13045 14003 20186 4109 4121 6823
    

    如何获得数字顺序?Perl是否有用于合并排序、插入排序等的内置函数?

    7 回复  |  直到 8 年前
        1
  •  47
  •   daotoad    15 年前

    可以将自定义比较函数传递给Perl的排序例程。只需使用:

    @sorted = sort { $a <=> $b } @unsorted;
    

    这个 sort 函数接受自定义比较函数作为其第一个参数,其形式为代码块。这个 {...} 部分就是这个代码块(参见 http://perldoc.perl.org/functions/sort.html )

    分类 每当需要比较要排序的数组中的两个元素时,将调用此自定义比较函数。 分类 始终传入两个值进行比较 $a , $b ,比较函数必须返回比较结果。在这种情况下,它只使用运算符进行数值比较(请参见 http://perldoc.perl.org/perlop.html#Equality-Operators ,它可能只是为了这个目的而创建的:-)。

    解决方案不知羞耻地从 Perl Cookbook “,第04章,第15分章(买这本书-值得一读!)

        2
  •  9
  •   Eugene Yarmash    8 年前

    提供一个比较函数 sort() :

    # sort numerically ascending
    my @articles = sort {$a <=> $b} @files;
    
    # sort numerically descending
    my @articles = sort {$b <=> $a} @files;
    

    默认排序函数为 cmp ,字符串比较,将排序 (1, 2, 10) 进入之内 (1, 10, 2) . <=> 上面使用的是数值比较运算符。

        3
  •  8
  •   codaddict    15 年前

    珀尔 sort 默认情况下,按ASCII顺序按字母顺序排序。要按数字排序,可以使用:

    @sorted = sort { $a <=> $b } @_;
    
        4
  •  6
  •   toolic    15 年前

    这是一个Perl常见问题解答。从命令行:

    perldoc -q sort
    

    perlfaq4: How do I sort an array by (anything)?

        5
  •  5
  •   ase    15 年前
    @l = (4109, 4121, 6823, 12967, 12971, 14003, 20186, 1, 3, 4);
    @l = sort { $a <=> $b } @l;
    print "@l\n"; # 1 3 4 4109 4121 6823 12967 12971 14003 20186
    

    您必须提供自己的排序子例程 { $a <=> $b }

        6
  •  2
  •   Konstantin Likhter    15 年前

    您可以预先定义用于比较数组中的值的函数。 perldoc -f sort 举个例子:

    # sort using explicit subroutine name
    sub byage {
       $age{$a} <=> $age{$b};  # presuming numeric
    }
    @sortedclass = sort byage @class;
    

    <=> 运算符用于数字排序。

    @sorted = sort {$a <=> $b} @unsorted;
    
        7
  •  0
  •   Apostolos    8 年前

    我只想为任何一个有这个问题的人节省很多时间,像我这样的Perl新手,也就是说,如何对一个数字数组进行排序,因为我不仅浪费了时间,而且让我发疯了!

    因此,在这里(以及其他许多地方),对数值数组进行排序的方法是:

    @sorted_array = sort { $a <=> $b } @unsorted_array;
    

    现在你尝试一下,你会得到一个错误:“在排序比较中不能使用我的$A”!(这是因为您已经使用“strict.pm”声明了“$A”)。但是,您也不能使用未声明的变量,因为它们将被拒绝为未定义的!所以,你可能会像我一样陷入僵局。

    我必须以“艰难的方式”解决这个问题,因为无论是在这里,还是在perldoc.perl.org,或者在我访问过的任何其他地方,都没有人关心,$A和$B是为此用途保留的(令牌)!(当然,当使用“严格”时,应该这样做。这很疯狂,因为“a”和“b”是编程中最常见的短变量之一,逻辑上也是如此!)

    我希望这会对很多程序员有所帮助,他们是Perl的新手,他们会访问这个页面!