Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl数组哈希-字母数字键的数字排序_Arrays_Perl_Sorting_Hash_Alphanumeric - Fatal编程技术网

Arrays Perl数组哈希-字母数字键的数字排序

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"

我知道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");

我只需要对键进行排序…但排序是字符串中的数字。我不能进行字符串排序,因为我在“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;
另请参见。

可能有用:可能有用: