【问题标题】:How to sort numbers in PerlPerl中如何对数字进行排序
【发布时间】:2011-04-04 05:05:21
【问题描述】:
print "@_\n";
4109 4121 6823 12967 12971 14003 20186

如何在 Perl 中对其进行排序?

使用@sorted = sort(@_); 给我一个字母顺序:

13041 13045 14003 20186 4109 4121 6823

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

【问题讨论】:

    标签: arrays perl sorting


    【解决方案1】:

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

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

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

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

    无耻地从“Perl Cookbook”盗取解决方案,第04章第15章(买书——值得!)

    【讨论】:

    • 我会删除该链接,它未经所有者同意就分发受版权保护的材料。您可以推荐原始作品(Perl Cookbook、Christiansen 和 Torkington)。
    • 似乎对 [Perl] 标签的共识是,链接到 O'Reilly 书籍(或任何书籍)的盗版副本是不好的。编辑删除
    • 对不起,没有意识到链接是盗版材料。感谢您修复它。
    • Google 图书通常有很好的非盗版材料适合链接。
    【解决方案2】:

    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)。上面使用的&lt;=&gt; 是数值比较运算符。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • @Lazer:查看我的解释(我提交了相同的答案,只是稍晚一点;-))。
      【解决方案4】:

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

      perldoc -q sort
      

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

      【讨论】:

        【解决方案5】:
        @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 &lt;=&gt; $b }

        【讨论】:

        • 什么是{ $a &lt;=&gt; $b }anonymous function?也许在你的回答中详细说明一下。
        • 对不起,我忘记了我曾经知道的关于 perl 的一切。好像叫做“block”,a/b变量是sort在使用block时提供的“package global”变量。
        【解决方案6】:

        您可以预定义一个函数,用于计算数组中的值。

        perldoc -f sort给你一个例子:

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

        &lt;=&gt; 运算符用于数字排序。

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

        【讨论】:

          【解决方案7】:

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

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

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

          perldoc.perl.org 和大多数其他地方都没有提到 '$a' '$b' 保留(令牌)用于此用途! (当然,当一个人使用 'strict' 时,应该使用哪个。这很疯狂,因为 'a' 和 'b' 是编程中最常见的短变量之一,而且在逻辑上也是如此!)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-07
            相关资源
            最近更新 更多