Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Perl 涉及两个参数的排序哈希_Perl_Sorting_Perl Module - Fatal编程技术网

Perl 涉及两个参数的排序哈希

Perl 涉及两个参数的排序哈希,perl,sorting,perl-module,Perl,Sorting,Perl Module,我有一个哈希表,其中包含以下格式的键: scaffold_902_159 scaffold_2_1980420 scaffold_2_10 scaffold_10_402 scaffold_2_10 scaffold_2_1980420 scaffold_10_402 scaffold_902_159 我想打印按以下格式排序的哈希: scaffold_902_159 scaffold_2_1980420 scaffold_2_10 scaffold_10_402 scaffold_2_10

我有一个哈希表,其中包含以下格式的键:

scaffold_902_159
scaffold_2_1980420
scaffold_2_10
scaffold_10_402
scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
我想打印按以下格式排序的哈希:

scaffold_902_159
scaffold_2_1980420
scaffold_2_10
scaffold_10_402
scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
所以首先我得先点第一个数字,然后再点最后一个。我不希望正则表达式搜索“scaffold_u2;”,因为这可能会有所不同。我的意思是,我可以使用其他格式的散列,比如“blablabla\u NUMBER,或者blablabla\u NUMBER”。键的最后一部分是唯一永久的

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

my @keys = sort {
          my ($aa) = $a =~ /(\d+)/;
          my ($bb) = $b =~ /(\d+)/;
          $aa <=> $bb;
        } keys %hash;
foreach my $key (@keys) {
   print $key;
}
my@keys=sort{
my($aa)=$a=~/(\d+)/;
我的($bb)=$b=~/(\d+)/;
$aa$bb;
}密钥%hash;
foreach my$key(@keys){
打印$key;
}
有什么建议吗?

去救援吧

#!/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;
输出:

scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
blablabla_10_403
blablabla901_3
blablabla902_1
scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
should_come_last_9999_0
scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159

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

#!/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;
输出:

scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
blablabla_10_403
blablabla901_3
blablabla902_1
scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159
should_come_last_9999_0
scaffold_2_10
scaffold_2_1980420
scaffold_10_402
scaffold_902_159

这将对两列进行排序,并使用从字符串创建这些列

use strict;
use warnings;
use feature 'say';

my @keys = qw(
    scaffold_902_159
    scaffold_2_1980420
    scaffold_2_10
    scaffold_10_402
);

@keys =
    map { $_->[0] }                                               # transform back
    sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }           # sort
    map {                                                         # transform
        m/(\d+)(?:\D+(\d+))/;
        [ $_, ( defined $2 ? ( $1, $2 ) : ( 0xffffffff, $1 ) ) ]
    } @keys;

say for @keys;
初始转换
map
返回的数据结构如下所示:

[ 'scaffold_902_159', 902, 159 ]
排序
首先使用数字排序,按上面的索引1(即
902
)进行排序。如果RHS和LHS相等,则该运算符返回
0
,因此or
|
继续使用正确的表达式,然后在索引2上排序(即
159

因为你说第一个数字是可选的,如果只有第二个数字,那么这些元素应该排在最后,我们必须用一个很高的数字来代替它。在不使用64位整数的情况下,
0xffffffff
是我们可以得到的最高数字

第二个
map
从数组引用的索引
0
中拉出完整键

如果我们向输入中添加一些其他内容,如您建议的
blanumber_NUMBER
,它仍然只会对数字进行排序,而完全忽略字符串部分

my @keys = qw(
    should_come_last_9999_0
    blablabla_10_403
    scaffold_902_159
    scaffold_2_1980420
    scaffold_2_10
    scaffold_10_402
    no_first_number_1
);
以下是输出:

scaffold_2_10
scaffold_2_1980420
scaffold_10_402
blablabla_10_403
blablabla902_1
scaffold_902_159
should_come_last_9999_0
no_first_number_1

相关的,如果不重复:-您必须做一些工作来查找字符串中的数字,但公认的答案是您需要的。你可能想把它和施瓦茨变换结合起来。是否有固定发生次数的blabla_数,或者blabla&NUMBER可以像blabla_-bla_数那样得到改变?@AbhiNickz,在你的问题上想得更多一点,也许有时会发生中间数不是数字的情况。这些事件应该出现在最后,当然按第二个数字排序(总是在那里)。我们正在就我对你最后评论的回答进行讨论。你能为我们澄清一下吗?谢谢。:)非常感谢。我会尝试一下,如果它有效的话,我会接受答案。如果你没有中间号码的话,你知道会发生什么吗?它会起作用的。正如模块的描述所说的那样,
Sort::natural--按词汇排序,但按数字排序
。注释使我的答案无效。我注意到Sort::natural在处理这组数据方面做得非常好。请参阅我答案第二部分的输出。@ChankeyPathak它确实如此。但我理解这个问题,因为它不应该按单词排序,而你的应该。我认为这个问题有点模棱两可。您的解决方案中的
no_first_number_1
会发生什么情况?
blablabla_10_403,no_first_number_1,scaffold_2_10,scaffold_2_1980420,scaffold_10_402;,scaffold_902_159;,应该最后一次_9999_
,我认为这是正确的,因为它按字母顺序排列了第一列。@ChankeyPathak我认为这是错误的。OP的评论说,这些眼病应该出现在最后,当然应该按第二个数字排序(总是在那里)。这听起来像是我最后的输出。但似乎OP要么解释错了,要么还没有注意到。我希望他们回来至少澄清一下…:D