%probes - 是任意顺序的探针名称列表(按其位置组织,不是按字母顺序或数字排列)。
我需要根据每个数组中第一列/单元格的值(探针名称)对数组数组(@data_a)进行排序,但根据我在有序散列%probes中指定的顺序对它们进行排序。
@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;
将根据 %probes 中的顺序对名称列表进行排序。
我需要以某种方式将这两者结合起来,按第一列(探针名称)对大数组进行排序,维护所有关联的数值,并按 %probes 的顺序排序。
我想在 %probes 哈希中指定的顺序:
my %probes = ("KCNT2 E3"=>1,"KCNT2 E1"=>2,"CFH E1"=>3,...);
建议的组合方法如下:
@data_bsort= sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;
不影响数组的顺序,但这可能是因为它是为了对数组而不是数组的数组进行排序。
您的问题中没有足够的信息,除了显而易见的信息之外无法为您提供建议:
my @data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;
但是,我有两个建议可能会对您自己解决问题大有帮助。
始终在 every
Perl 脚本中包含
use strict;
和
use warnings;
。
这是成为一名更好的程序员可以做的第一件事,也是人们每次在 Stack Overflow 上提问时都应该模仿的事情。
最初的进入障碍是必须在每个变量之前使用
my
声明来重新编写脚本,但这是一个值得的情况。 另外,不要偷懒,只需在脚本顶部声明所有变量即可。 尝试为每个变量提供尽可能小的范围。 这不仅使代码更具可读性,而且还可以帮助这两个编译指示向您指出明显的错误。
在这种情况下,您很可能使用的是实际上未定义的键或值,如果
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
结构也是如此,并分享这些内容以及您预期的排序顺序的详细信息。
我相信根据你写的内容,这就是你想要的:
@data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a
根据每个数组引用的第一个值用作 %probes 哈希中的键,对 @data_a 中的数组引用进行排序。