use*_*627 1 arrays sorting perl hash alphanumeric
我知道perl中的默认排序是ASCII排序,而不是数字排序.但是,我如何在数字上对具有数字的字符串进行排序?
例如,我有一个数组哈希,如下所示:
myhash{ANN20021015_0101_XML_71.9} = ("anta", "hunna", "huma");
myhash{ANN20021115_0049_XML_14.1} = ("lqd", "qAl", "arrajul");
myhash{ANN20021115_0049_XML_14.2} = ("anna", "alwalada");
Run Code Online (Sandbox Code Playgroud)
我只需要键进行排序..但排序是字符串中的数字.我不能做一个字符串排序因为我在"1"之后得到"10",但我也不能做数字排序!
首先,您的代码无效Perl,可能无法按照您的想法执行.总是
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
在你的程序的头部解决任何简单的错误.代码看起来应该是这样的
$myhash{'ANN20021015_0101_XML_71.9'} = ["anta", "hunna", "huma"];
$myhash{'ANN20021115_0049_XML_14.1'} = ["lqd", "qAl", "arrajul"];
$myhash{'ANN20021115_0049_XML_14.2'} = ["anna", "alwalada"];
Run Code Online (Sandbox Code Playgroud)
排序上比整个价值以外的东西,你可以改变$a
和$b
排序块内,结果数值进行排序<=>
,而不是stringwise的<=>
.此代码可满足您的需求
my @sorted = sort {
my ($aa) = $a =~ /.*_(.+)/;
my ($bb) = $b =~ /.*_(.+)/;
$aa <=> $bb;
} keys %myhash;
Run Code Online (Sandbox Code Playgroud)
但是如果你有大量的数据,那么使用Schwartzian变换可能是有利可图的,这将避免在每次比较时提取字符串的数字部分
my @sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { /.*_(.+)/ and [$_, $1] }
keys %myhash;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1908 次 |
最近记录: |