给出以下哈希:
%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 %errors
和sort{$a <=> $b) keys %errors
但未成功。
如何解决此问题?
答案 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
;首先比较yyyy
和x
数字,
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