perl 根据多列排序(列的顺序很重要)

perl sorting according to multiple columns (order of column matters)

我正在尝试学习按多列对 perl 中的二维数组进行排序,以便按指定列的顺序对值进行排序,即先根据第一列排序,然后根据第二列排序列等。所以 table:

3  2
5  2
1  4

排序为

1  4
3  2
5  2

如果排序在第一列、第二列或到

3  2
5  2
1  4

如果先按第二列再按第一列排序。

但事实证明我什至无法根据任何列对 table 进行排序。

my @a = ([3,1,2], [3,5,4]);
my @b = sort {

    $a->[0] <=> $b->[0]

} @a;
print Dumper \@b

什么都不做。我在哪里犯了错误以及如何以正确的列顺序实现上述排序?

您的代码确实有效。

正在将两个 sort[3,1,2][3,5,4] 的结果传递给标量。然后根据引用数组 ($a->[0] <=> $b->[0]) 的元素对这两个元素进行排序。为什么什么都不做?好吧,因为这些数组与其第一个元素具有相同的值 (3)。

如果您引用的数组在第一列中有不同的值(比如 [6,1,2][3,5,4]),您将首先返回值最低的那个([3,5,4]然后 [6,1,2]).

你正在排序,只是不是你认为的那样。 @a 包含两个对象,都是数组引用。您正在按每个引用数组中第一个元素的值对这两个引用进行排序。

使用您的示例数据考虑以下内容:

@array = ([3,2],[5,2],[1,4]);
@sorted_01 = sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @array;
@sorted_10 = sort { $a->[1] <=> $b->[1] || $a->[0] <=> $b->[0] } @array;

构造 a<=>b || c<=>d 比较 ab。如果结果不为零(即 ab 不相等),则表达式计算结束。但是,如果它们相等,则评估继续并且 returns 比较 cd 的结果。

我正在阅读 my @a = ([3,1,2], [3,5,4]);,因为它有 2 行,每行 3 列。我会存储 table

3 3
1 5
2 4

as my @a = ([3, 3], [1, 5], [2, 4]); 相反,使用 Short-circuit evaluation:

使排序更简单
my @a = ([3, 3], [1, 5], [2, 4]);

my @b = sort {
    # Short-circuit evaluation:
    # if the values in the first column aren't equal, return the <=> result for
    # that, otherwise return the <=> result for the second column
    $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1];
} @a;

# @b is now ([1, 5], [2, 4], [3, 3])