Arrays Perl数组哈希-字母数字键的数字排序
我知道Perl中的默认排序是ASCII排序,而不是数字排序。但是如何对有数字的字符串进行数字排序呢 例如,我有一个数组散列,如下所示:Arrays Perl数组哈希-字母数字键的数字排序,arrays,perl,sorting,hash,alphanumeric,Arrays,Perl,Sorting,Hash,Alphanumeric,我知道Perl中的默认排序是ASCII排序,而不是数字排序。但是如何对有数字的字符串进行数字排序呢 例如,我有一个数组散列,如下所示: myhash{ANN20021015_0101_XML_71.9} = ("anta", "hunna", "huma"); myhash{ANN20021115_0049_XML_14.1} = ("lqd", "qAl", "arrajul"
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");
我只需要对键进行排序…但排序是字符串中的数字。我不能进行字符串排序,因为我在“1”后面加上“10”,但我也不能进行数字排序 首先,您的代码不是有效的Perl,可能不会执行您认为的操作。总是
use strict;
use warnings;
在程序的前端解决任何简单的错误。代码应该如下所示
$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"];
要对整个值以外的内容进行排序,可以在排序块内变换$a
和$b
,并对结果进行数字排序
,而不是按字符串排序
。此代码满足您的需要
my @sorted = sort {
my ($aa) = $a =~ /.*_(.+)/;
my ($bb) = $b =~ /.*_(.+)/;
$aa <=> $bb;
} keys %myhash;
首先,您的代码不是有效的Perl,可能不会执行您认为的操作。总是
use strict;
use warnings;
在程序的前端解决任何简单的错误。代码应该如下所示
$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"];
要对整个值以外的内容进行排序,可以在排序块内变换$a
和$b
,并对结果进行数字排序
,而不是按字符串排序
。此代码满足您的需要
my @sorted = sort {
my ($aa) = $a =~ /.*_(.+)/;
my ($bb) = $b =~ /.*_(.+)/;
$aa <=> $bb;
} keys %myhash;
您需要进行自定义排序:将字符串切割成您知道的文本/数字部分,并根据需要进行比较 从您的示例中,看起来您需要
文字
数字
,但您可以更改正则表达式,使其适合您
my $cut = qr/(.*?\.)(\d+)(.*)/;
sort {
my @a = $a =~ $cut; my @b = $b =~ $cut;
$a[0] cmp $b[0] || $a[1] <=> $b[1] || $a[2] cmp $b[2]
} keys %myhash;
my$cut=qr/(.*?\)(\d+)(.*)/;
排序{
我的@a=$a=~$cut;我的@b=$b=~$cut;
$a[0]cmp$b[0]| |$a[1]$b[1]| |$a[2]cmp$b[2]
}密钥%myhash;
另请参见。您需要进行自定义排序:将字符串切割成您知道的部分,然后根据需要进行比较 从您的示例中,看起来您需要
文字
数字
,但您可以更改正则表达式,使其适合您
my $cut = qr/(.*?\.)(\d+)(.*)/;
sort {
my @a = $a =~ $cut; my @b = $b =~ $cut;
$a[0] cmp $b[0] || $a[1] <=> $b[1] || $a[2] cmp $b[2]
} keys %myhash;
my$cut=qr/(.*?\)(\d+)(.*)/;
排序{
我的@a=$a=~$cut;我的@b=$b=~$cut;
$a[0]cmp$b[0]| |$a[1]$b[1]| |$a[2]cmp$b[2]
}密钥%myhash;
另请参见。可能有用:可能有用: