如何按列对Perl中的二维数组进行排序,忽略一些列?

时间:2014-10-10 19:52:43

标签: perl sorting

我在Perl中有一个二维数组。我想对数组中的列进行排序,但我想忽略最左边的n列。我想按第0行中的值排序。

让我澄清一下可能是一个令人困惑的描述。我有一张这样的桌子:

Z W D F E C
0 1 2 3 4 5
6 7 8 9 0 1

我想忽略左边的一些列,比如说前两个。我想按第一行中的值对剩余列进行排序。最终结果如下:

Z W C D E F
0 1 5 2 4 3
6 7 1 8 0 9

我如何以优雅的方式做到这一点?我理解如何使用比较函数进行排序,但我不知道如何告诉Perl忽略前n列。

1 个答案:

答案 0 :(得分:1)

您需要在旧订单和新订单之间创建关系。

以下内容创建了一个索引数组@new_order,可用于对每一行进行排序:

#!/usr/bin/perl
use strict;
use warnings;

my @data = map { [split] } <DATA>;

my @old_header = @{ $data[0] };
my %old_order = map { $old_header[$_] => $_ } ( 0 .. $#old_header );

my @new_header = ( splice( @old_header, 0, 2 ), sort @old_header );
my @new_order = @old_order{@new_header};

# Output Transformed Data
for (@data) {
    print "@{$_}[@new_order]\n"
}

__DATA__
Z W D F E C
0 1 2 3 4 5
6 7 8 9 0 1

输出:

Z W C D E F
0 1 5 2 4 3
6 7 1 8 0 9