2

给定以下哈希:

%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但没有成功。

我该如何解决这个问题?

4

5 回答 5

4

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

use Sort::Naturally qw(nsort);
say $_ for nsort keys %errors;
于 2013-10-23T19:57:42.637 回答
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;
于 2013-10-23T15:20:00.083 回答
2

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

于 2013-10-23T15:35:26.273 回答
1

键将按yyyy-Wx升序排序;首先通过比较yyyy然后x数字,

my @sorted_keys = map $_->[0],
  sort {
    $a->[1] <=> $b->[1]
    ||
    $a->[2] <=> $b->[2]
  }
  map [ $_, /(\d+)/g ],
  keys %errors;
于 2013-10-23T14:20:13.563 回答
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
于 2015-04-06T06:36:19.930 回答