【问题标题】:Sorting in PerlPerl 中的排序
【发布时间】:2013-08-24 09:26:18
【问题描述】:

我是 Perl 新手,遇到了数组排序问题。

例如,如果我的输入是

@lines =  qw/ S-1.1 A-1.4 V-1.3 /

输出应该是有序的

A-1.4, V-1.3, S-1.1.

这个想法是根据字符串中- 之后的内容来整理的。我试过sort {$a <=> $b} @lines,但没有帮助。

请提出一些想法来完成这项工作。

【问题讨论】:

  • 您的意思是@lines = ("S-1.1", "A-1.4", "V-1.3")?为什么不直接通过正则表达式提取排序标准并执行Schwartzian Transform
  • 在您的示例中,排序是基于- 之后的数字倒序排列的?是这个意思吗?
  • @amon:他说他是 Perl 新手,你问 “你为什么不直接通过正则表达式提取排序标准并进行 Schwartzian 变换?”!!

标签: arrays perl sorting


【解决方案1】:
use strict;  
use warnings;

my @lines = ("S-1.1", "A-1.4", "V-1.3"); 
@lines = sort { (split /-/, $b)[1] <=> (split /-/, $a)[1] } @lines; 
print join ', ', @lines;

输出

A-1.4, V-1.3, S-1.1

【讨论】:

    【解决方案2】:
    my @lines = qw(S-1.1 A-1.4 V-1.3);
    @lines = sort { substr($a, index($a, '-') + 1) <=>
                    substr($b, index($b, '-') + 1) } @lines;
    print "@lines\n";  #: S-1.1 V-1.3 A-1.4
    

    如果你想在字符串中有多个点,那就有点复杂了:

    sub pad($) {
      local $_ = $_[0];
      s/^[^-]*?-//;
      s/(\d+)/sprintf("%020d",$1)/ge;  
      $_
    }
    my @lines = qw(S-1.2.12 B-1.2.9 A-1.4 V-1.3);
    @lines = sort { pad($a) cmp pad($b) } @lines;
    print "@lines\n";  #: B-1.2.9 S-1.2.12 V-1.3 A-1.4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多