Perl - 如何在保持散列中指定的顺序的同时根据列的值对数组数组进行排序?

时间:2014-08-15 16:56:30

标签: perl sorting

%探测器 - 是一个任意顺序的探测器名称列表(按其位置组织,不是按字母顺序排列,也不是数字化)。

我需要根据每个数组中第一列/单元格的值(探测名称)对数组数组(@data_a)进行排序,但要根据我在有序散列%探测器中指定的顺序对它们进行排序。

@data_a看起来像:

(
 (D88 5833.4 82544.0),
 (D92 3431.1 3432.1),
 ....
)


@data_asort=sort {$a->[0] cmp $b->[0]} @data_a;

将按特定列排序,这可行,但按字母顺序排序:

(
 (100X 45454.1 48482.2),
 (105Y 49911.1 81819.2),
...
)

我明白了:

@data_bsort=sort {$probes{$b} <=> $probes{$a}} keys %probes; 

将根据%探测器中的顺序对名称列表进行排序。

我需要以某种方式将这两者结合起来,用第一列(探测名称)对大数组进行排序,保持所有相关的数值,按%探测的顺序排序。

我想在%探针哈希中指定的顺序:

my %probes = ("KCNT2 E3"=>1,"KCNT2 E1"=>2,"CFH E1"=>3,...);

以下建议的组合方法:

@data_bsort= sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;

不影响数组的顺序,但这可能是因为它意味着对数组进行排序而不是数组数组。

2 个答案:

答案 0 :(得分:1)

除了显而易见的事项之外,你的问题中没有足够的信息给你一个建议:

my @data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;

但是,我有两个指针,可能会帮助您自己解决问题。

  1. 始终在每个perl脚本中包含use strict;use warnings;

    这是你能成为更好的程序员的第一件事,而且每当他们在SO上提出问题时,都应该对此进行建模。

    在每个变量之前,必须使用my声明重新编写脚本,这将是一个初步的障碍,但这是一个值得的案例。此外,不要试图懒惰,只是在脚本的顶部声明所有变量。尽量给每个变量尽可能小的范围。这不仅使一些代码更具可读性,而且还有助于这两个pragma指出明显的错误。

    在这种情况下,您很可能正在使用实际未定义的键或值,如果warnings可以帮助您使用以下消息,那将非常有用:

    Use of uninitialized value in sort
    
  2. 按复杂结构排序时,请先考虑使用mapfor打印转换。

    # my @data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;
    
    print "'$probes{$_->[0]}'\n" for @data_a;
    

    您在修订后的问题中已经说明上述sort无效?好吧,为了调试,看看你实际排序的内容会很有用。

  3. 无论如何,您在适当的地方获得问题的帮助,但您需要在获得详细帮助之前提供更多信息。

    看看你是否可以将你的问题缩小到5个元素的简短示例数据结构。与您的%probes结构完全相同,并与您的预期排序顺序的详细信息一起分享。

答案 1 :(得分:0)

我相信根据你所写的内容,这就是你想要的:

@data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a

根据每个数组ref的第一个值被用作%探测器哈希中的键,对@data_a中的数组引用进行排序。