我有一个字符串数组,其中单个元素由管道(|)分隔。
示例数据是:
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中取出一个新的数组。
答案 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);