数组的perl哈希 - 数字键的字母数字键?

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",但我也不能做数字排序!

Bor*_*din 6

首先,您的代码无效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)