在Perl中排序字母数字哈希键?

时间:2013-10-23 14:16:27

标签: perl sorting

给出以下哈希:

%errors = (
    "2013-W9 -> 2013-W12" => 1,
    "2013-W5 -> 2013-W8" => 1,
    "2013-W13 -> 2013-W15" => 1
)

我正在尝试这样排序(所以我可以在foreach循环中使用它):

%errors = (
    "2013-W5 -> 2013-W8" => 1,
    "2013-W9 -> 2013-W12" => 1,
    "2013-W13 -> 2013-W15" => 1
)

我已尝试sort keys %errorssort{$a <=> $b) keys %errors但未成功。

如何解决此问题?

5 个答案:

答案 0 :(得分:4)

在这种情况下,CPAN模块Sort::Naturally似乎正常工作:

use Sort::Naturally qw(nsort);
say $_ for nsort keys %errors;

答案 1 :(得分:2)

您想要的排序顺序并不完全清楚,但这种方法很容易扩展:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my %errors = (
    "2013-W9 -> 2013-W12" => 1,
    "2013-W5 -> 2013-W8" => 1,
    "2013-W13 -> 2013-W15" => 1
);

my @sorted_keys = map { $_->[0] }
  sort { $a->[1] <=> $b->[1] }
  map  { [ $_, /W(\d+)/ ] } keys %errors;

say $_ for @sorted_keys;

答案 2 :(得分:2)

The Alphanum Algorithm ,有一个通用的字符串排序例程,它将数字子字符串作为数字进行比较,以包括Perl在内的多种语言实现。

答案 3 :(得分:1)

键将按升序排序yyyy-Wx;首先比较yyyyx数字,

my @sorted_keys = map $_->[0],
  sort {
    $a->[1] <=> $b->[1]
    ||
    $a->[2] <=> $b->[2]
  }
  map [ $_, /(\d+)/g ],
  keys %errors;

答案 4 :(得分:0)

我有类似的情况。我用以下方式解决了我的问题:

你试过

sort keys %errors

sort{$a <=> $b) keys %errors

尝试几乎相似的事情,但有一点不同:

代码:

my %errors = (
    "2013-W9 -> 2013-W12" => 1,
    "2013-W5 -> 2013-W8" => 1,
    "2013-W13 -> 2013-W15" => 1);

foreach my $val(sort {my ($anum) = ($a =~ /\d+-\w(\d+)$/);  my ($bnum) = ($b =~ /\d+-\w(\d+)$/);  $anum <=> $bnum} keys %error
{
    print "$val\n";
}

在上面的示例中,我仅打印了密钥。

<强>输出:

2013-W5 -> 2013-W8
2013-W9 -> 2013-W12
2013-W13 -> 2013-W15