在perl中对数组进行排序

时间:2017-08-06 18:09:12

标签: arrays perl sorting

我有一个字符串数组,其中单个元素由管道(|)分隔。 示例数据是:    A | 1447 | 1个
   乙| 150 | 2
   Ç| 0 | 3
   d | 66 | 3
   E | 0 | 4
   F | 350 | 2

First Column是函数的名称。 第二列是执行所需的时间 第三列是函数相对于main发生的级别。

我必须按照中间元素降序排序的形式安排它,以便上面示例的输出为:

A | 1447 | 1

F | 350个| 2个
乙| 150 | 2
d | 66 | 3
E | 0 | 4

C | 0 | 3

上述模式表明功能A耗时1447毫秒。在功能F中花费了1447 ms 350 ms,在功能B中花费了150 ms。剩余用于此处未提及的功能。 以类似的方式,在功能B中花费的150毫秒中,66个花费在功能D中,0毫秒花费在功能C中。功能D中的66毫秒花费在功能E中。这意味着它花在了其他未提及的功能上。

考虑到我们正在评估提供给我们的数据。我们必须对它们进行排序并从perl中取出一个新的数组。

1 个答案:

答案 0 :(得分:1)

如果要对树的每个节点的子节点进行排序,首先需要构建树!

use strict;
use warnings qw( all );
use feature qw( current_sub say );

my $tree = do {
   my @ancestors = [ undef, undef, undef, [] ];
   while (<>) {
      chomp;
      my ($name, $time, $depth) = split /\|/;

      die "Bad data\n" if $depth < 1;
      die "Bad data\n" if $depth > @ancestors;
      splice(@ancestors, $depth);

      my $node = [ $name, $time, $depth, [] ];
      push @{ $ancestors[-1][3] }, $node;
      push @stack, $node;
   }

   my @roots = @{ $ancestors[0][3] };
   die "No roots\n"       if !@roots;
   die "Multiple roots\n" if @roots > 1;
   $roots[0]
};

sub {
   my ($node) = @_;
   say join "|", @$node[0,1,2];
   __SUB__->($_) for sort { $b->[1] <=> $a->[1] } @{ $node->[3] };
}->($tree);