%探测器 - 是一个任意顺序的探测器名称列表(按其位置组织,不是按字母顺序排列,也不是数字化)。
我需要根据每个数组中第一列/单元格的值(探测名称)对数组数组(@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;
不影响数组的顺序,但这可能是因为它意味着对数组进行排序而不是数组数组。
答案 0 :(得分:1)
除了显而易见的事项之外,你的问题中没有足够的信息给你一个建议:
my @data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;
但是,我有两个指针,可能会帮助您自己解决问题。
始终在每个perl脚本中包含use strict;
和use warnings;
。
这是你能成为更好的程序员的第一件事,而且每当他们在SO上提出问题时,都应该对此进行建模。
在每个变量之前,必须使用my
声明重新编写脚本,这将是一个初步的障碍,但这是一个值得的案例。此外,不要试图懒惰,只是在脚本的顶部声明所有变量。尽量给每个变量尽可能小的范围。这不仅使一些代码更具可读性,而且还有助于这两个pragma指出明显的错误。
在这种情况下,您很可能正在使用实际未定义的键或值,如果warnings
可以帮助您使用以下消息,那将非常有用:
Use of uninitialized value in sort
按复杂结构排序时,请先考虑使用map
或for
打印转换。
# my @data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;
print "'$probes{$_->[0]}'\n" for @data_a;
您在修订后的问题中已经说明上述sort
无效?好吧,为了调试,看看你实际排序的内容会很有用。
无论如何,您在适当的地方获得问题的帮助,但您需要在获得详细帮助之前提供更多信息。
看看你是否可以将你的问题缩小到5个元素的简短示例数据结构。与您的%probes
结构完全相同,并与您的预期排序顺序的详细信息一起分享。
答案 1 :(得分:0)
我相信根据你所写的内容,这就是你想要的:
@data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a
根据每个数组ref的第一个值被用作%探测器哈希中的键,对@data_a中的数组引用进行排序。