gpt4 book ai didi

perl - 在 Perl 中对自定义日期进行排序

转载 作者:行者123 更新时间:2023-12-01 05:13:52 24 4
gpt4 key购买 nike

我有一个以日期为键的散列:

my %dates = (
'May 13, 2015' => 8,
'May 7, 2015' => 1,
'Apr 29, 2015' => 2,
'May 12, 2015' => 1,
'Apr 16, 2015' => 13,
'May 6, 2015' => 1,
);

我正在尝试按日期对它们进行排序。我试过两种方法:

foreach my $k (sort {join('', (split ' ', $a)[2,0,1]) <=> join('', (split ' ', $a)[2,0,1])} keys(%dates)) 
{ print $k . " = " . $dates{$k}; }

这不起作用,因为月份是一个字符串,而这个:

foreach my $k (sort {join('', (split ' ', $a)[2,0,1]) cmp join('', (split ' ', $a)[2,0,1])} keys(%dates)) 
{ print $k . " = " . $dates{$k}; }

也不起作用,它只是将所有 Apr 放在第一位,然后是 May。有人知道如何解决它吗?

最佳答案

您可以使用 Time::Piece 解析日期

#!/usr/bin/env perl

use strict;
use warnings;

use Time::Piece;

my %dates = (
'May 13, 2015' => 8,
'May 7, 2015' => 1,
'Apr 29, 2015' => 2,
'May 12, 2015' => 1,
'Apr 16, 2015' => 13,
'May 6, 2015' => 1,
);

for my $k (sort by_date keys %dates) {
print "$k => $dates{$k}\n";
}

sub by_date {
my ($ta, $tb) = map Time::Piece->strptime($_, '%b %d, %Y'), $a, $b;
$ta <=> $tb;
}

输出:

Apr 16, 2015 => 13Apr 29, 2015 => 2 May 6, 2015 => 1  May 7, 2015 => 1  May 12, 2015 => 1 May 13, 2015 => 8

Of course, if you wanted to give up the benefits of Time::Piece, you could do something along the following lines:

#!/usr/bin/env perl

use 5.010;
use strict;
use warnings;

my %dates = (
'May 13, 2015' => 8,
'May 7, 2015' => 1,
'Apr 29, 2015' => 2,
'May 12, 2015' => 1,
'Apr 16, 2015' => 13,
'May 6, 2015' => 1,
);

for my $k (sort by_ugliness keys %dates) {
print "$k => $dates{$k}\n";
}

sub by_ugliness {
state $months = {
do {
my $i = 1;
map {$_ => $i++}
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
}
};

my ($ta, $tb) = map [
/\A (\S+) \s+ ([0-9]{1,2}), \s+ ([0-9]{4})\z/x
], $a, $b;

($ta->[2] <=> $tb->[2]) ||
($months->{ $ta->[0] } <=> $months->{ $tb->[0]}) ||
($ta->[1] <=> $tb->[1]) ;
}

在某些时候,您将开始完善该模式匹配。不要;-)

关于perl - 在 Perl 中对自定义日期进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com