Perl:哈希2中的数组数组(Schwarzian变换)

时间:2011-10-31 12:10:42

标签: arrays perl sorting numerical

这实际上是这个主题的后续行动: Perl: Numerical sort of arrays in a hash

我无法编辑原始问题,因为我当前的代码有点不同,所以我只是将此问作为另一个问题。

好的,在使用Schwarzian变换之后,我有了这个:

my @mylines =("0.899 0.92 cat", 
            "9.999 0.001 dog",
            "-0.52 0.3 humpty", 
            "13.52 0.09 bumbo",
            "-1.52 0.98 nanny",
            "3.52 0.34 lala");

my @sorted = map { join ' ', @$_ }
             reverse sort { $a->[0] cmp $b->[0] or $a->[1] <=> $b->[1] }
             map { [ split ] } (@mylines);

print "$_\n" for @sorted;

我希望输出首先按第一列排序,然后排序第二列,但结果如下:

9.999 0.001 dog
3.52 0.34 lala
13.52 0.09 bumbo
0.899 0.92 cat
-1.52 0.98 nanny
-0.52 0.3 humpty

我想那是因为它正在进行角色排序......但我需要对它进行数字排序。我是否需要在sort函数中的某处放置类似java的“parseInt()”?

1 个答案:

答案 0 :(得分:3)

您正在第一列上执行cmp。这意味着它将其分类为文本。您的排序功能应该是:

sort { $a->[0] <=> $b->[0] or $a->[1] <=> $b->[1] } ...

哪个输出:

13.52 0.09 bumbo
9.999 0.001 dog
3.52 0.34 lala
0.899 0.92 cat
-0.52 0.3 humpty
-1.52 0.98 nanny

但是,您绝不需要在排序之前放置reverse,因为您始终可以撤消这些条款:

sort { $b->[0] <=> $a->[0] or $b->[1] <=> $a->[1] } ...