对参与两个参数的哈希进行排序

cuc*_*bit 3 sorting perl perl-module

我有以下格式的密钥哈希:

scaffold_902_159
scaffold_2_1980420
scaffold_2_10
scaffold_10_402
Run Code Online (Sandbox Code Playgroud)

我想打印出以下列格式排序的哈希:

scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
Run Code Online (Sandbox Code Playgroud)

所以首先我必须以数字方式订购第一个号码,然后参加最后一个号码.我不希望正则表达式搜索"scaffold_",因为这可能会有所不同.我的意思是,我可以使用其他格式的哈希,例如" blablabla_NUMBER_NUMBER,或blablablaNUMBER_NUMBER ".键_NUMBER的最后一部分是唯一永久的部分.

我有这个代码,但只能按数字排序第一个数字:

my @keys = sort {
          my ($aa) = $a =~ /(\d+)/;
          my ($bb) = $b =~ /(\d+)/;
          $aa <=> $bb;
        } keys %hash;
foreach my $key (@keys) {
   print $key;
}
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Cha*_*hak 6

排序::自然地救援!

#!/usr/bin/perl
use strict;
use warnings;
use Sort::Naturally qw(nsort);
my %hash = (
                scaffold_902_159 => 'v1',
                scaffold_2_1980420 => 'v2',
                scaffold_2_10 => 'v3',
                scaffold_10_402 => 'v4',
            );
print "$_\n" for nsort keys %hash;
Run Code Online (Sandbox Code Playgroud)

输出:

scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
Run Code Online (Sandbox Code Playgroud)

根据您的查询,尝试了一些中间没有数字的键.

#!/usr/bin/perl
use strict;
use warnings;
use Sort::Naturally qw(nsort);
my @keys = qw(
    should_come_last_9999_0
    blablabla_10_403
    scaffold_902_159
    scaffold_2_1980420
    scaffold_2_10
    scaffold_10_402
    blablabla902_1
    blablabla901_3
);
print "$_\n" for nsort @keys;
Run Code Online (Sandbox Code Playgroud)

输出:

blablabla_10_403
blablabla901_3
blablabla902_1
scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
should_come_last_9999_0
Run Code Online (Sandbox Code Playgroud)