我在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列。
答案 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